diff options
Diffstat (limited to 'drivers/net/enic/enic_main.c')
-rw-r--r-- | drivers/net/enic/enic_main.c | 326 |
1 files changed, 36 insertions, 290 deletions
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index a0af48c51fb..8b9cad5e971 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include "vnic_vic.h" | 44 | #include "vnic_vic.h" |
45 | #include "enic_res.h" | 45 | #include "enic_res.h" |
46 | #include "enic.h" | 46 | #include "enic.h" |
47 | #include "enic_dev.h" | ||
47 | 48 | ||
48 | #define ENIC_NOTIFY_TIMER_PERIOD (2 * HZ) | 49 | #define ENIC_NOTIFY_TIMER_PERIOD (2 * HZ) |
49 | #define WQ_ENET_MAX_DESC_LEN (1 << WQ_ENET_LEN_BITS) | 50 | #define WQ_ENET_MAX_DESC_LEN (1 << WQ_ENET_LEN_BITS) |
@@ -190,18 +191,6 @@ static int enic_get_settings(struct net_device *netdev, | |||
190 | return 0; | 191 | return 0; |
191 | } | 192 | } |
192 | 193 | ||
193 | static int enic_dev_fw_info(struct enic *enic, | ||
194 | struct vnic_devcmd_fw_info **fw_info) | ||
195 | { | ||
196 | int err; | ||
197 | |||
198 | spin_lock(&enic->devcmd_lock); | ||
199 | err = vnic_dev_fw_info(enic->vdev, fw_info); | ||
200 | spin_unlock(&enic->devcmd_lock); | ||
201 | |||
202 | return err; | ||
203 | } | ||
204 | |||
205 | static void enic_get_drvinfo(struct net_device *netdev, | 194 | static void enic_get_drvinfo(struct net_device *netdev, |
206 | struct ethtool_drvinfo *drvinfo) | 195 | struct ethtool_drvinfo *drvinfo) |
207 | { | 196 | { |
@@ -246,17 +235,6 @@ static int enic_get_sset_count(struct net_device *netdev, int sset) | |||
246 | } | 235 | } |
247 | } | 236 | } |
248 | 237 | ||
249 | static int enic_dev_stats_dump(struct enic *enic, struct vnic_stats **vstats) | ||
250 | { | ||
251 | int err; | ||
252 | |||
253 | spin_lock(&enic->devcmd_lock); | ||
254 | err = vnic_dev_stats_dump(enic->vdev, vstats); | ||
255 | spin_unlock(&enic->devcmd_lock); | ||
256 | |||
257 | return err; | ||
258 | } | ||
259 | |||
260 | static void enic_get_ethtool_stats(struct net_device *netdev, | 238 | static void enic_get_ethtool_stats(struct net_device *netdev, |
261 | struct ethtool_stats *stats, u64 *data) | 239 | struct ethtool_stats *stats, u64 *data) |
262 | { | 240 | { |
@@ -896,9 +874,10 @@ static struct net_device_stats *enic_get_stats(struct net_device *netdev) | |||
896 | return net_stats; | 874 | return net_stats; |
897 | } | 875 | } |
898 | 876 | ||
899 | static void enic_reset_multicast_list(struct enic *enic) | 877 | static void enic_reset_addr_lists(struct enic *enic) |
900 | { | 878 | { |
901 | enic->mc_count = 0; | 879 | enic->mc_count = 0; |
880 | enic->uc_count = 0; | ||
902 | enic->flags = 0; | 881 | enic->flags = 0; |
903 | } | 882 | } |
904 | 883 | ||
@@ -919,32 +898,6 @@ static int enic_set_mac_addr(struct net_device *netdev, char *addr) | |||
919 | return 0; | 898 | return 0; |
920 | } | 899 | } |
921 | 900 | ||
922 | static int enic_dev_add_station_addr(struct enic *enic) | ||
923 | { | ||
924 | int err = 0; | ||
925 | |||
926 | if (is_valid_ether_addr(enic->netdev->dev_addr)) { | ||
927 | spin_lock(&enic->devcmd_lock); | ||
928 | err = vnic_dev_add_addr(enic->vdev, enic->netdev->dev_addr); | ||
929 | spin_unlock(&enic->devcmd_lock); | ||
930 | } | ||
931 | |||
932 | return err; | ||
933 | } | ||
934 | |||
935 | static int enic_dev_del_station_addr(struct enic *enic) | ||
936 | { | ||
937 | int err = 0; | ||
938 | |||
939 | if (is_valid_ether_addr(enic->netdev->dev_addr)) { | ||
940 | spin_lock(&enic->devcmd_lock); | ||
941 | err = vnic_dev_del_addr(enic->vdev, enic->netdev->dev_addr); | ||
942 | spin_unlock(&enic->devcmd_lock); | ||
943 | } | ||
944 | |||
945 | return err; | ||
946 | } | ||
947 | |||
948 | static int enic_set_mac_address_dynamic(struct net_device *netdev, void *p) | 901 | static int enic_set_mac_address_dynamic(struct net_device *netdev, void *p) |
949 | { | 902 | { |
950 | struct enic *enic = netdev_priv(netdev); | 903 | struct enic *enic = netdev_priv(netdev); |
@@ -989,42 +942,7 @@ static int enic_set_mac_address(struct net_device *netdev, void *p) | |||
989 | return enic_dev_add_station_addr(enic); | 942 | return enic_dev_add_station_addr(enic); |
990 | } | 943 | } |
991 | 944 | ||
992 | static int enic_dev_packet_filter(struct enic *enic, int directed, | 945 | static void enic_update_multicast_addr_list(struct enic *enic) |
993 | int multicast, int broadcast, int promisc, int allmulti) | ||
994 | { | ||
995 | int err; | ||
996 | |||
997 | spin_lock(&enic->devcmd_lock); | ||
998 | err = vnic_dev_packet_filter(enic->vdev, directed, | ||
999 | multicast, broadcast, promisc, allmulti); | ||
1000 | spin_unlock(&enic->devcmd_lock); | ||
1001 | |||
1002 | return err; | ||
1003 | } | ||
1004 | |||
1005 | static int enic_dev_add_addr(struct enic *enic, u8 *addr) | ||
1006 | { | ||
1007 | int err; | ||
1008 | |||
1009 | spin_lock(&enic->devcmd_lock); | ||
1010 | err = vnic_dev_add_addr(enic->vdev, addr); | ||
1011 | spin_unlock(&enic->devcmd_lock); | ||
1012 | |||
1013 | return err; | ||
1014 | } | ||
1015 | |||
1016 | static int enic_dev_del_addr(struct enic *enic, u8 *addr) | ||
1017 | { | ||
1018 | int err; | ||
1019 | |||
1020 | spin_lock(&enic->devcmd_lock); | ||
1021 | err = vnic_dev_del_addr(enic->vdev, addr); | ||
1022 | spin_unlock(&enic->devcmd_lock); | ||
1023 | |||
1024 | return err; | ||
1025 | } | ||
1026 | |||
1027 | static void enic_add_multicast_addr_list(struct enic *enic) | ||
1028 | { | 946 | { |
1029 | struct net_device *netdev = enic->netdev; | 947 | struct net_device *netdev = enic->netdev; |
1030 | struct netdev_hw_addr *ha; | 948 | struct netdev_hw_addr *ha; |
@@ -1079,7 +997,7 @@ static void enic_add_multicast_addr_list(struct enic *enic) | |||
1079 | enic->mc_count = mc_count; | 997 | enic->mc_count = mc_count; |
1080 | } | 998 | } |
1081 | 999 | ||
1082 | static void enic_add_unicast_addr_list(struct enic *enic) | 1000 | static void enic_update_unicast_addr_list(struct enic *enic) |
1083 | { | 1001 | { |
1084 | struct net_device *netdev = enic->netdev; | 1002 | struct net_device *netdev = enic->netdev; |
1085 | struct netdev_hw_addr *ha; | 1003 | struct netdev_hw_addr *ha; |
@@ -1156,9 +1074,9 @@ static void enic_set_rx_mode(struct net_device *netdev) | |||
1156 | } | 1074 | } |
1157 | 1075 | ||
1158 | if (!promisc) { | 1076 | if (!promisc) { |
1159 | enic_add_unicast_addr_list(enic); | 1077 | enic_update_unicast_addr_list(enic); |
1160 | if (!allmulti) | 1078 | if (!allmulti) |
1161 | enic_add_multicast_addr_list(enic); | 1079 | enic_update_multicast_addr_list(enic); |
1162 | } | 1080 | } |
1163 | } | 1081 | } |
1164 | 1082 | ||
@@ -1170,26 +1088,6 @@ static void enic_vlan_rx_register(struct net_device *netdev, | |||
1170 | enic->vlan_group = vlan_group; | 1088 | enic->vlan_group = vlan_group; |
1171 | } | 1089 | } |
1172 | 1090 | ||
1173 | /* rtnl lock is held */ | ||
1174 | static void enic_vlan_rx_add_vid(struct net_device *netdev, u16 vid) | ||
1175 | { | ||
1176 | struct enic *enic = netdev_priv(netdev); | ||
1177 | |||
1178 | spin_lock(&enic->devcmd_lock); | ||
1179 | enic_add_vlan(enic, vid); | ||
1180 | spin_unlock(&enic->devcmd_lock); | ||
1181 | } | ||
1182 | |||
1183 | /* rtnl lock is held */ | ||
1184 | static void enic_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | ||
1185 | { | ||
1186 | struct enic *enic = netdev_priv(netdev); | ||
1187 | |||
1188 | spin_lock(&enic->devcmd_lock); | ||
1189 | enic_del_vlan(enic, vid); | ||
1190 | spin_unlock(&enic->devcmd_lock); | ||
1191 | } | ||
1192 | |||
1193 | /* netif_tx_lock held, BHs disabled */ | 1091 | /* netif_tx_lock held, BHs disabled */ |
1194 | static void enic_tx_timeout(struct net_device *netdev) | 1092 | static void enic_tx_timeout(struct net_device *netdev) |
1195 | { | 1093 | { |
@@ -1197,40 +1095,6 @@ static void enic_tx_timeout(struct net_device *netdev) | |||
1197 | schedule_work(&enic->reset); | 1095 | schedule_work(&enic->reset); |
1198 | } | 1096 | } |
1199 | 1097 | ||
1200 | static int enic_vnic_dev_deinit(struct enic *enic) | ||
1201 | { | ||
1202 | int err; | ||
1203 | |||
1204 | spin_lock(&enic->devcmd_lock); | ||
1205 | err = vnic_dev_deinit(enic->vdev); | ||
1206 | spin_unlock(&enic->devcmd_lock); | ||
1207 | |||
1208 | return err; | ||
1209 | } | ||
1210 | |||
1211 | static int enic_dev_init_prov(struct enic *enic, struct vic_provinfo *vp) | ||
1212 | { | ||
1213 | int err; | ||
1214 | |||
1215 | spin_lock(&enic->devcmd_lock); | ||
1216 | err = vnic_dev_init_prov(enic->vdev, | ||
1217 | (u8 *)vp, vic_provinfo_size(vp)); | ||
1218 | spin_unlock(&enic->devcmd_lock); | ||
1219 | |||
1220 | return err; | ||
1221 | } | ||
1222 | |||
1223 | static int enic_dev_init_done(struct enic *enic, int *done, int *error) | ||
1224 | { | ||
1225 | int err; | ||
1226 | |||
1227 | spin_lock(&enic->devcmd_lock); | ||
1228 | err = vnic_dev_init_done(enic->vdev, done, error); | ||
1229 | spin_unlock(&enic->devcmd_lock); | ||
1230 | |||
1231 | return err; | ||
1232 | } | ||
1233 | |||
1234 | static int enic_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) | 1098 | static int enic_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) |
1235 | { | 1099 | { |
1236 | struct enic *enic = netdev_priv(netdev); | 1100 | struct enic *enic = netdev_priv(netdev); |
@@ -1262,6 +1126,8 @@ static int enic_set_port_profile(struct enic *enic, u8 *mac) | |||
1262 | if (err) | 1126 | if (err) |
1263 | return err; | 1127 | return err; |
1264 | 1128 | ||
1129 | enic_reset_addr_lists(enic); | ||
1130 | |||
1265 | switch (enic->pp.request) { | 1131 | switch (enic->pp.request) { |
1266 | 1132 | ||
1267 | case PORT_REQUEST_ASSOCIATE: | 1133 | case PORT_REQUEST_ASSOCIATE: |
@@ -1318,18 +1184,20 @@ static int enic_set_port_profile(struct enic *enic, u8 *mac) | |||
1318 | vic_provinfo_free(vp); | 1184 | vic_provinfo_free(vp); |
1319 | if (err) | 1185 | if (err) |
1320 | return err; | 1186 | return err; |
1321 | |||
1322 | enic->pp.set |= ENIC_SET_APPLIED; | ||
1323 | break; | 1187 | break; |
1324 | 1188 | ||
1325 | case PORT_REQUEST_DISASSOCIATE: | 1189 | case PORT_REQUEST_DISASSOCIATE: |
1326 | enic->pp.set &= ~ENIC_SET_APPLIED; | ||
1327 | break; | 1190 | break; |
1328 | 1191 | ||
1329 | default: | 1192 | default: |
1330 | return -EINVAL; | 1193 | return -EINVAL; |
1331 | } | 1194 | } |
1332 | 1195 | ||
1196 | /* Set flag to indicate that the port assoc/disassoc | ||
1197 | * request has been sent out to fw | ||
1198 | */ | ||
1199 | enic->pp.set |= ENIC_PORT_REQUEST_APPLIED; | ||
1200 | |||
1333 | return 0; | 1201 | return 0; |
1334 | } | 1202 | } |
1335 | 1203 | ||
@@ -1379,9 +1247,6 @@ static int enic_set_vf_port(struct net_device *netdev, int vf, | |||
1379 | 1247 | ||
1380 | if (is_zero_ether_addr(netdev->dev_addr)) | 1248 | if (is_zero_ether_addr(netdev->dev_addr)) |
1381 | random_ether_addr(netdev->dev_addr); | 1249 | random_ether_addr(netdev->dev_addr); |
1382 | } else if (new_pp.request == PORT_REQUEST_DISASSOCIATE) { | ||
1383 | if (!is_zero_ether_addr(enic->pp.mac_addr)) | ||
1384 | enic_dev_del_addr(enic, enic->pp.mac_addr); | ||
1385 | } | 1250 | } |
1386 | 1251 | ||
1387 | memcpy(&enic->pp, &new_pp, sizeof(struct enic_port_profile)); | 1252 | memcpy(&enic->pp, &new_pp, sizeof(struct enic_port_profile)); |
@@ -1390,9 +1255,6 @@ static int enic_set_vf_port(struct net_device *netdev, int vf, | |||
1390 | if (err) | 1255 | if (err) |
1391 | goto set_port_profile_cleanup; | 1256 | goto set_port_profile_cleanup; |
1392 | 1257 | ||
1393 | if (!is_zero_ether_addr(enic->pp.mac_addr)) | ||
1394 | enic_dev_add_addr(enic, enic->pp.mac_addr); | ||
1395 | |||
1396 | set_port_profile_cleanup: | 1258 | set_port_profile_cleanup: |
1397 | memset(enic->pp.vf_mac, 0, ETH_ALEN); | 1259 | memset(enic->pp.vf_mac, 0, ETH_ALEN); |
1398 | 1260 | ||
@@ -1411,7 +1273,7 @@ static int enic_get_vf_port(struct net_device *netdev, int vf, | |||
1411 | int err, error, done; | 1273 | int err, error, done; |
1412 | u16 response = PORT_PROFILE_RESPONSE_SUCCESS; | 1274 | u16 response = PORT_PROFILE_RESPONSE_SUCCESS; |
1413 | 1275 | ||
1414 | if (!(enic->pp.set & ENIC_SET_APPLIED)) | 1276 | if (!(enic->pp.set & ENIC_PORT_REQUEST_APPLIED)) |
1415 | return -ENODATA; | 1277 | return -ENODATA; |
1416 | 1278 | ||
1417 | err = enic_dev_init_done(enic, &done, &error); | 1279 | err = enic_dev_init_done(enic, &done, &error); |
@@ -1489,62 +1351,6 @@ static int enic_rq_alloc_buf(struct vnic_rq *rq) | |||
1489 | return 0; | 1351 | return 0; |
1490 | } | 1352 | } |
1491 | 1353 | ||
1492 | static int enic_rq_alloc_buf_a1(struct vnic_rq *rq) | ||
1493 | { | ||
1494 | struct rq_enet_desc *desc = vnic_rq_next_desc(rq); | ||
1495 | |||
1496 | if (vnic_rq_posting_soon(rq)) { | ||
1497 | |||
1498 | /* SW workaround for A0 HW erratum: if we're just about | ||
1499 | * to write posted_index, insert a dummy desc | ||
1500 | * of type resvd | ||
1501 | */ | ||
1502 | |||
1503 | rq_enet_desc_enc(desc, 0, RQ_ENET_TYPE_RESV2, 0); | ||
1504 | vnic_rq_post(rq, 0, 0, 0, 0); | ||
1505 | } else { | ||
1506 | return enic_rq_alloc_buf(rq); | ||
1507 | } | ||
1508 | |||
1509 | return 0; | ||
1510 | } | ||
1511 | |||
1512 | static int enic_dev_hw_version(struct enic *enic, | ||
1513 | enum vnic_dev_hw_version *hw_ver) | ||
1514 | { | ||
1515 | int err; | ||
1516 | |||
1517 | spin_lock(&enic->devcmd_lock); | ||
1518 | err = vnic_dev_hw_version(enic->vdev, hw_ver); | ||
1519 | spin_unlock(&enic->devcmd_lock); | ||
1520 | |||
1521 | return err; | ||
1522 | } | ||
1523 | |||
1524 | static int enic_set_rq_alloc_buf(struct enic *enic) | ||
1525 | { | ||
1526 | enum vnic_dev_hw_version hw_ver; | ||
1527 | int err; | ||
1528 | |||
1529 | err = enic_dev_hw_version(enic, &hw_ver); | ||
1530 | if (err) | ||
1531 | return err; | ||
1532 | |||
1533 | switch (hw_ver) { | ||
1534 | case VNIC_DEV_HW_VER_A1: | ||
1535 | enic->rq_alloc_buf = enic_rq_alloc_buf_a1; | ||
1536 | break; | ||
1537 | case VNIC_DEV_HW_VER_A2: | ||
1538 | case VNIC_DEV_HW_VER_UNKNOWN: | ||
1539 | enic->rq_alloc_buf = enic_rq_alloc_buf; | ||
1540 | break; | ||
1541 | default: | ||
1542 | return -ENODEV; | ||
1543 | } | ||
1544 | |||
1545 | return 0; | ||
1546 | } | ||
1547 | |||
1548 | static void enic_rq_indicate_buf(struct vnic_rq *rq, | 1354 | static void enic_rq_indicate_buf(struct vnic_rq *rq, |
1549 | struct cq_desc *cq_desc, struct vnic_rq_buf *buf, | 1355 | struct cq_desc *cq_desc, struct vnic_rq_buf *buf, |
1550 | int skipped, void *opaque) | 1356 | int skipped, void *opaque) |
@@ -1681,7 +1487,7 @@ static int enic_poll(struct napi_struct *napi, int budget) | |||
1681 | 0 /* don't unmask intr */, | 1487 | 0 /* don't unmask intr */, |
1682 | 0 /* don't reset intr timer */); | 1488 | 0 /* don't reset intr timer */); |
1683 | 1489 | ||
1684 | err = vnic_rq_fill(&enic->rq[0], enic->rq_alloc_buf); | 1490 | err = vnic_rq_fill(&enic->rq[0], enic_rq_alloc_buf); |
1685 | 1491 | ||
1686 | /* Buffer allocation failed. Stay in polling | 1492 | /* Buffer allocation failed. Stay in polling |
1687 | * mode so we can try to fill the ring again. | 1493 | * mode so we can try to fill the ring again. |
@@ -1731,7 +1537,7 @@ static int enic_poll_msix(struct napi_struct *napi, int budget) | |||
1731 | 0 /* don't unmask intr */, | 1537 | 0 /* don't unmask intr */, |
1732 | 0 /* don't reset intr timer */); | 1538 | 0 /* don't reset intr timer */); |
1733 | 1539 | ||
1734 | err = vnic_rq_fill(&enic->rq[rq], enic->rq_alloc_buf); | 1540 | err = vnic_rq_fill(&enic->rq[rq], enic_rq_alloc_buf); |
1735 | 1541 | ||
1736 | /* Buffer allocation failed. Stay in polling mode | 1542 | /* Buffer allocation failed. Stay in polling mode |
1737 | * so we can try to fill the ring again. | 1543 | * so we can try to fill the ring again. |
@@ -1901,39 +1707,6 @@ static int enic_dev_notify_set(struct enic *enic) | |||
1901 | return err; | 1707 | return err; |
1902 | } | 1708 | } |
1903 | 1709 | ||
1904 | static int enic_dev_notify_unset(struct enic *enic) | ||
1905 | { | ||
1906 | int err; | ||
1907 | |||
1908 | spin_lock(&enic->devcmd_lock); | ||
1909 | err = vnic_dev_notify_unset(enic->vdev); | ||
1910 | spin_unlock(&enic->devcmd_lock); | ||
1911 | |||
1912 | return err; | ||
1913 | } | ||
1914 | |||
1915 | static int enic_dev_enable(struct enic *enic) | ||
1916 | { | ||
1917 | int err; | ||
1918 | |||
1919 | spin_lock(&enic->devcmd_lock); | ||
1920 | err = vnic_dev_enable_wait(enic->vdev); | ||
1921 | spin_unlock(&enic->devcmd_lock); | ||
1922 | |||
1923 | return err; | ||
1924 | } | ||
1925 | |||
1926 | static int enic_dev_disable(struct enic *enic) | ||
1927 | { | ||
1928 | int err; | ||
1929 | |||
1930 | spin_lock(&enic->devcmd_lock); | ||
1931 | err = vnic_dev_disable(enic->vdev); | ||
1932 | spin_unlock(&enic->devcmd_lock); | ||
1933 | |||
1934 | return err; | ||
1935 | } | ||
1936 | |||
1937 | static void enic_notify_timer_start(struct enic *enic) | 1710 | static void enic_notify_timer_start(struct enic *enic) |
1938 | { | 1711 | { |
1939 | switch (vnic_dev_get_intr_mode(enic->vdev)) { | 1712 | switch (vnic_dev_get_intr_mode(enic->vdev)) { |
@@ -1967,7 +1740,7 @@ static int enic_open(struct net_device *netdev) | |||
1967 | } | 1740 | } |
1968 | 1741 | ||
1969 | for (i = 0; i < enic->rq_count; i++) { | 1742 | for (i = 0; i < enic->rq_count; i++) { |
1970 | vnic_rq_fill(&enic->rq[i], enic->rq_alloc_buf); | 1743 | vnic_rq_fill(&enic->rq[i], enic_rq_alloc_buf); |
1971 | /* Need at least one buffer on ring to get going */ | 1744 | /* Need at least one buffer on ring to get going */ |
1972 | if (vnic_rq_desc_used(&enic->rq[i]) == 0) { | 1745 | if (vnic_rq_desc_used(&enic->rq[i]) == 0) { |
1973 | netdev_err(netdev, "Unable to alloc receive buffers\n"); | 1746 | netdev_err(netdev, "Unable to alloc receive buffers\n"); |
@@ -2285,29 +2058,6 @@ static int enic_set_rss_nic_cfg(struct enic *enic) | |||
2285 | rss_hash_bits, rss_base_cpu, rss_enable); | 2058 | rss_hash_bits, rss_base_cpu, rss_enable); |
2286 | } | 2059 | } |
2287 | 2060 | ||
2288 | static int enic_dev_hang_notify(struct enic *enic) | ||
2289 | { | ||
2290 | int err; | ||
2291 | |||
2292 | spin_lock(&enic->devcmd_lock); | ||
2293 | err = vnic_dev_hang_notify(enic->vdev); | ||
2294 | spin_unlock(&enic->devcmd_lock); | ||
2295 | |||
2296 | return err; | ||
2297 | } | ||
2298 | |||
2299 | static int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic) | ||
2300 | { | ||
2301 | int err; | ||
2302 | |||
2303 | spin_lock(&enic->devcmd_lock); | ||
2304 | err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev, | ||
2305 | IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN); | ||
2306 | spin_unlock(&enic->devcmd_lock); | ||
2307 | |||
2308 | return err; | ||
2309 | } | ||
2310 | |||
2311 | static void enic_reset(struct work_struct *work) | 2061 | static void enic_reset(struct work_struct *work) |
2312 | { | 2062 | { |
2313 | struct enic *enic = container_of(work, struct enic, reset); | 2063 | struct enic *enic = container_of(work, struct enic, reset); |
@@ -2320,7 +2070,7 @@ static void enic_reset(struct work_struct *work) | |||
2320 | enic_dev_hang_notify(enic); | 2070 | enic_dev_hang_notify(enic); |
2321 | enic_stop(enic->netdev); | 2071 | enic_stop(enic->netdev); |
2322 | enic_dev_hang_reset(enic); | 2072 | enic_dev_hang_reset(enic); |
2323 | enic_reset_multicast_list(enic); | 2073 | enic_reset_addr_lists(enic); |
2324 | enic_init_vnic_resources(enic); | 2074 | enic_init_vnic_resources(enic); |
2325 | enic_set_rss_nic_cfg(enic); | 2075 | enic_set_rss_nic_cfg(enic); |
2326 | enic_dev_set_ig_vlan_rewrite_mode(enic); | 2076 | enic_dev_set_ig_vlan_rewrite_mode(enic); |
@@ -2332,7 +2082,7 @@ static void enic_reset(struct work_struct *work) | |||
2332 | static int enic_set_intr_mode(struct enic *enic) | 2082 | static int enic_set_intr_mode(struct enic *enic) |
2333 | { | 2083 | { |
2334 | unsigned int n = min_t(unsigned int, enic->rq_count, ENIC_RQ_MAX); | 2084 | unsigned int n = min_t(unsigned int, enic->rq_count, ENIC_RQ_MAX); |
2335 | unsigned int m = 1; | 2085 | unsigned int m = min_t(unsigned int, enic->wq_count, ENIC_WQ_MAX); |
2336 | unsigned int i; | 2086 | unsigned int i; |
2337 | 2087 | ||
2338 | /* Set interrupt mode (INTx, MSI, MSI-X) depending | 2088 | /* Set interrupt mode (INTx, MSI, MSI-X) depending |
@@ -2475,9 +2225,7 @@ static const struct net_device_ops enic_netdev_dynamic_ops = { | |||
2475 | .ndo_tx_timeout = enic_tx_timeout, | 2225 | .ndo_tx_timeout = enic_tx_timeout, |
2476 | .ndo_set_vf_port = enic_set_vf_port, | 2226 | .ndo_set_vf_port = enic_set_vf_port, |
2477 | .ndo_get_vf_port = enic_get_vf_port, | 2227 | .ndo_get_vf_port = enic_get_vf_port, |
2478 | #ifdef IFLA_VF_MAX | ||
2479 | .ndo_set_vf_mac = enic_set_vf_mac, | 2228 | .ndo_set_vf_mac = enic_set_vf_mac, |
2480 | #endif | ||
2481 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2229 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2482 | .ndo_poll_controller = enic_poll_controller, | 2230 | .ndo_poll_controller = enic_poll_controller, |
2483 | #endif | 2231 | #endif |
@@ -2556,25 +2304,12 @@ static int enic_dev_init(struct enic *enic) | |||
2556 | 2304 | ||
2557 | enic_init_vnic_resources(enic); | 2305 | enic_init_vnic_resources(enic); |
2558 | 2306 | ||
2559 | err = enic_set_rq_alloc_buf(enic); | ||
2560 | if (err) { | ||
2561 | dev_err(dev, "Failed to set RQ buffer allocator, aborting\n"); | ||
2562 | goto err_out_free_vnic_resources; | ||
2563 | } | ||
2564 | |||
2565 | err = enic_set_rss_nic_cfg(enic); | 2307 | err = enic_set_rss_nic_cfg(enic); |
2566 | if (err) { | 2308 | if (err) { |
2567 | dev_err(dev, "Failed to config nic, aborting\n"); | 2309 | dev_err(dev, "Failed to config nic, aborting\n"); |
2568 | goto err_out_free_vnic_resources; | 2310 | goto err_out_free_vnic_resources; |
2569 | } | 2311 | } |
2570 | 2312 | ||
2571 | err = enic_dev_set_ig_vlan_rewrite_mode(enic); | ||
2572 | if (err) { | ||
2573 | dev_err(dev, | ||
2574 | "Failed to set ingress vlan rewrite mode, aborting.\n"); | ||
2575 | goto err_out_free_vnic_resources; | ||
2576 | } | ||
2577 | |||
2578 | switch (vnic_dev_get_intr_mode(enic->vdev)) { | 2313 | switch (vnic_dev_get_intr_mode(enic->vdev)) { |
2579 | default: | 2314 | default: |
2580 | netif_napi_add(netdev, &enic->napi[0], enic_poll, 64); | 2315 | netif_napi_add(netdev, &enic->napi[0], enic_poll, 64); |
@@ -2713,6 +2448,22 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2713 | goto err_out_vnic_unregister; | 2448 | goto err_out_vnic_unregister; |
2714 | } | 2449 | } |
2715 | 2450 | ||
2451 | /* Setup devcmd lock | ||
2452 | */ | ||
2453 | |||
2454 | spin_lock_init(&enic->devcmd_lock); | ||
2455 | |||
2456 | /* | ||
2457 | * Set ingress vlan rewrite mode before vnic initialization | ||
2458 | */ | ||
2459 | |||
2460 | err = enic_dev_set_ig_vlan_rewrite_mode(enic); | ||
2461 | if (err) { | ||
2462 | dev_err(dev, | ||
2463 | "Failed to set ingress vlan rewrite mode, aborting.\n"); | ||
2464 | goto err_out_dev_close; | ||
2465 | } | ||
2466 | |||
2716 | /* Issue device init to initialize the vnic-to-switch link. | 2467 | /* Issue device init to initialize the vnic-to-switch link. |
2717 | * We'll start with carrier off and wait for link UP | 2468 | * We'll start with carrier off and wait for link UP |
2718 | * notification later to turn on carrier. We don't need | 2469 | * notification later to turn on carrier. We don't need |
@@ -2736,11 +2487,6 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
2736 | } | 2487 | } |
2737 | } | 2488 | } |
2738 | 2489 | ||
2739 | /* Setup devcmd lock | ||
2740 | */ | ||
2741 | |||
2742 | spin_lock_init(&enic->devcmd_lock); | ||
2743 | |||
2744 | err = enic_dev_init(enic); | 2490 | err = enic_dev_init(enic); |
2745 | if (err) { | 2491 | if (err) { |
2746 | dev_err(dev, "Device initialization failed, aborting\n"); | 2492 | dev_err(dev, "Device initialization failed, aborting\n"); |