12 * See the License for the specific language governing permissions |
12 * See the License for the specific language governing permissions |
13 * and limitations under the License. |
13 * and limitations under the License. |
14 * |
14 * |
15 *********************************************************/ |
15 *********************************************************/ |
16 /* |
16 /* |
17 * Copyright (c) 2012 by Delphix. All rights reserved. |
17 * Copyright (c) 2012, 2014 by Delphix. All rights reserved. |
18 */ |
18 */ |
19 |
19 |
20 #include <vmxnet3_solaris.h> |
20 #include <vmxnet3_solaris.h> |
21 |
21 |
22 /* |
22 /* |
177 break; |
177 break; |
178 case MAC_STAT_COLLISIONS: |
178 case MAC_STAT_COLLISIONS: |
179 *val = 0; |
179 *val = 0; |
180 break; |
180 break; |
181 case MAC_STAT_RBYTES: |
181 case MAC_STAT_RBYTES: |
182 *val = rxStats->LROBytesRxOK + |
182 *val = rxStats->ucastBytesRxOK + |
183 rxStats->ucastBytesRxOK + |
|
184 rxStats->mcastBytesRxOK + |
183 rxStats->mcastBytesRxOK + |
185 rxStats->bcastBytesRxOK; |
184 rxStats->bcastBytesRxOK; |
186 break; |
185 break; |
187 case MAC_STAT_IPACKETS: |
186 case MAC_STAT_IPACKETS: |
188 *val = rxStats->LROPktsRxOK + |
187 *val = rxStats->ucastPktsRxOK + |
189 rxStats->ucastPktsRxOK + |
|
190 rxStats->mcastPktsRxOK + |
188 rxStats->mcastPktsRxOK + |
191 rxStats->bcastPktsRxOK; |
189 rxStats->bcastPktsRxOK; |
192 break; |
190 break; |
193 case MAC_STAT_OBYTES: |
191 case MAC_STAT_OBYTES: |
194 *val = txStats->TSOBytesTxOK + |
192 *val = txStats->ucastBytesTxOK + |
195 txStats->ucastBytesTxOK + |
|
196 txStats->mcastBytesTxOK + |
193 txStats->mcastBytesTxOK + |
197 txStats->bcastBytesTxOK; |
194 txStats->bcastBytesTxOK; |
198 break; |
195 break; |
199 case MAC_STAT_OPACKETS: |
196 case MAC_STAT_OPACKETS: |
200 *val = txStats->TSOPktsTxOK + |
197 *val = txStats->ucastPktsTxOK + |
201 txStats->ucastPktsTxOK + |
|
202 txStats->mcastPktsTxOK + |
198 txStats->mcastPktsTxOK + |
203 txStats->bcastPktsTxOK; |
199 txStats->bcastPktsTxOK; |
204 break; |
200 break; |
205 case ETHER_STAT_LINK_DUPLEX: |
201 case ETHER_STAT_LINK_DUPLEX: |
206 *val = LINK_DUPLEX_FULL; |
202 *val = LINK_DUPLEX_FULL; |
957 /* |
953 /* |
958 *--------------------------------------------------------------------------- |
954 *--------------------------------------------------------------------------- |
959 * |
955 * |
960 * vmxnet3_change_mtu -- |
956 * vmxnet3_change_mtu -- |
961 * |
957 * |
962 * Change the MTU as seen by the driver. Reset the device and tx/rx queues |
958 * Change the MTU as seen by the driver. This is only supported when |
963 * so that buffers of right size are posted in rx queues. |
959 * the mac is stopped. |
964 * |
960 * |
965 * Results: |
961 * Results: |
966 * EINVAL for invalid MTUs or other failures. 0 for success. |
962 * EBUSY if the device is enabled. |
|
963 * EINVAL for invalid MTU values. |
|
964 * 0 on success. |
967 * |
965 * |
968 * Side effects: |
966 * Side effects: |
969 * None. |
967 * None. |
970 * |
968 * |
971 *--------------------------------------------------------------------------- |
969 *--------------------------------------------------------------------------- |
972 */ |
970 */ |
973 |
971 |
974 static int |
972 static int |
975 vmxnet3_change_mtu(vmxnet3_softc_t *dp, uint32_t new_mtu) |
973 vmxnet3_change_mtu(vmxnet3_softc_t *dp, uint32_t new_mtu) |
976 { |
974 { |
977 int ret = 0, do_reset = 0, macret; |
975 int ret; |
978 ASSERT(dp); |
976 |
|
977 if (dp->devEnabled) |
|
978 return EBUSY; |
|
979 |
979 if (new_mtu == dp->cur_mtu) { |
980 if (new_mtu == dp->cur_mtu) { |
980 VMXNET3_WARN(dp, "New MTU is same as old mtu : %d.\n", new_mtu); |
981 VMXNET3_WARN(dp, "New MTU is same as old mtu : %d.\n", new_mtu); |
981 return 0; |
982 return 0; |
982 } |
983 } |
983 |
984 |
985 VMXNET3_WARN(dp, "New MTU not in valid range [%d, %d].\n", |
986 VMXNET3_WARN(dp, "New MTU not in valid range [%d, %d].\n", |
986 VMXNET3_MIN_MTU, VMXNET3_MAX_MTU); |
987 VMXNET3_MIN_MTU, VMXNET3_MAX_MTU); |
987 return EINVAL; |
988 return EINVAL; |
988 } |
989 } |
989 |
990 |
990 if (dp->devEnabled) { |
|
991 do_reset = 1; |
|
992 vmxnet3_stop(dp); |
|
993 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); |
|
994 } |
|
995 |
|
996 dp->cur_mtu = new_mtu; |
991 dp->cur_mtu = new_mtu; |
997 |
992 |
998 if (do_reset) { |
993 if ((ret = mac_maxsdu_update(dp->mac, new_mtu)) != 0) |
999 if ((ret = vmxnet3_start(dp)) != 0) |
994 VMXNET3_WARN(dp, "Unable to update mac with %d mtu: %d", new_mtu, ret); |
1000 VMXNET3_WARN(dp, "Unable to restart the device: %d", ret); |
|
1001 } |
|
1002 |
|
1003 if ((macret = mac_maxsdu_update(dp->mac, new_mtu)) != 0) { |
|
1004 VMXNET3_WARN(dp, "Unable to update mac with %d mtu: %d", new_mtu, macret); |
|
1005 if (ret == 0) |
|
1006 ret = macret; |
|
1007 } |
|
1008 |
995 |
1009 return ret; |
996 return ret; |
1010 } |
997 } |
1011 |
998 |
1012 |
999 |
1254 |
1241 |
1255 atomic_inc_32(&dp->reset_count); |
1242 atomic_inc_32(&dp->reset_count); |
1256 vmxnet3_stop(dp); |
1243 vmxnet3_stop(dp); |
1257 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); |
1244 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); |
1258 if ((ret = vmxnet3_start(dp)) != DDI_SUCCESS) |
1245 if ((ret = vmxnet3_start(dp)) != DDI_SUCCESS) |
1259 VMXNET3_WARN(dp, "failed to restart the device: %d", ret); |
1246 VMXNET3_WARN(dp, "failed to reset the device: %d", ret); |
1260 } |
1247 } |
1261 |
1248 |
1262 /* |
1249 /* |
1263 *--------------------------------------------------------------------------- |
1250 *--------------------------------------------------------------------------- |
1264 * |
1251 * |
1303 } |
1290 } |
1304 } |
1291 } |
1305 if (events & VMXNET3_ECR_LINK) { |
1292 if (events & VMXNET3_ECR_LINK) { |
1306 vmxnet3_refresh_linkstate(dp); |
1293 vmxnet3_refresh_linkstate(dp); |
1307 linkStateChanged = B_TRUE; |
1294 linkStateChanged = B_TRUE; |
|
1295 } |
|
1296 if (events & VMXNET3_ECR_DIC) { |
|
1297 VMXNET3_DEBUG(dp, 1, "device implementation change\n"); |
1308 } |
1298 } |
1309 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_ECR, events); |
1299 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_ECR, events); |
1310 } |
1300 } |
1311 |
1301 |
1312 return linkStateChanged; |
1302 return linkStateChanged; |
1824 } |
1814 } |
1825 |
1815 |
1826 void |
1816 void |
1827 vmxnet3_log(int level, vmxnet3_softc_t *dp, char *fmt, ...) |
1817 vmxnet3_log(int level, vmxnet3_softc_t *dp, char *fmt, ...) |
1828 { |
1818 { |
1829 va_list ap; |
1819 dev_err(dp->dip, level, fmt); |
1830 char buf[256]; |
1820 } |
1831 |
|
1832 va_start(ap, fmt); |
|
1833 (void) vsnprintf(buf, sizeof (buf), fmt, ap); |
|
1834 va_end(ap); |
|
1835 |
|
1836 cmn_err(level, VMXNET3_MODNAME ":%d: %s", dp->instance, buf); |
|
1837 } |
|