cxgb3 - Fix dev->priv usage

cxgb3 used netdev_priv() and dev->priv for different purposes.
In 2.6.23, netdev_priv() == dev->priv, cxgb3 needs a fix.
This patch is a partial backport of Dave Miller's changes in the
net-2.6.24 git branch.

Without this fix, cxgb3 crashes on 2.6.23.

Signed-off-by: Divy Le Ray <divy@chelsio.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Divy Le Ray and committed by Jeff Garzik 5fbf816f 54d0f56e

+105 -69
+1 -1
drivers/infiniband/hw/cxgb3/cxio_hal.c
··· 916 916 PDBG("%s opening rnic dev %s\n", __FUNCTION__, rdev_p->dev_name); 917 917 memset(&rdev_p->ctrl_qp, 0, sizeof(rdev_p->ctrl_qp)); 918 918 if (!rdev_p->t3cdev_p) 919 - rdev_p->t3cdev_p = T3CDEV(netdev_p); 919 + rdev_p->t3cdev_p = dev2t3cdev(netdev_p); 920 920 rdev_p->t3cdev_p->ulp = (void *) rdev_p; 921 921 err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_GET_PARAMS, 922 922 &(rdev_p->rnic_info));
+2
drivers/net/cxgb3/adapter.h
··· 50 50 51 51 struct vlan_group; 52 52 53 + struct adapter; 53 54 struct port_info { 55 + struct adapter *adapter; 54 56 struct vlan_group *vlan_grp; 55 57 const struct port_type_info *port_type; 56 58 u8 port_id;
+72 -54
drivers/net/cxgb3/cxgb3_main.c
··· 358 358 359 359 for (j = 0; j < pi->nqsets - 1; j++) { 360 360 if (!adap->dummy_netdev[dummy_idx]) { 361 - nd = alloc_netdev(0, "", ether_setup); 361 + struct port_info *p; 362 + 363 + nd = alloc_netdev(sizeof(*p), "", ether_setup); 362 364 if (!nd) 363 365 goto free_all; 364 366 365 - nd->priv = adap; 367 + p = netdev_priv(nd); 368 + p->adapter = adap; 366 369 nd->weight = 64; 367 370 set_bit(__LINK_STATE_START, &nd->state); 368 371 adap->dummy_netdev[dummy_idx] = nd; ··· 485 482 #define CXGB3_SHOW(name, val_expr) \ 486 483 static ssize_t format_##name(struct net_device *dev, char *buf) \ 487 484 { \ 488 - struct adapter *adap = dev->priv; \ 485 + struct port_info *pi = netdev_priv(dev); \ 486 + struct adapter *adap = pi->adapter; \ 489 487 return sprintf(buf, "%u\n", val_expr); \ 490 488 } \ 491 489 static ssize_t show_##name(struct device *d, struct device_attribute *attr, \ ··· 497 493 498 494 static ssize_t set_nfilters(struct net_device *dev, unsigned int val) 499 495 { 500 - struct adapter *adap = dev->priv; 496 + struct port_info *pi = netdev_priv(dev); 497 + struct adapter *adap = pi->adapter; 501 498 int min_tids = is_offload(adap) ? MC5_MIN_TIDS : 0; 502 499 503 500 if (adap->flags & FULL_INIT_DONE) ··· 520 515 521 516 static ssize_t set_nservers(struct net_device *dev, unsigned int val) 522 517 { 523 - struct adapter *adap = dev->priv; 518 + struct port_info *pi = netdev_priv(dev); 519 + struct adapter *adap = pi->adapter; 524 520 525 521 if (adap->flags & FULL_INIT_DONE) 526 522 return -EBUSY; ··· 562 556 static ssize_t tm_attr_show(struct device *d, struct device_attribute *attr, 563 557 char *buf, int sched) 564 558 { 565 - ssize_t len; 559 + struct port_info *pi = netdev_priv(to_net_dev(d)); 560 + struct adapter *adap = pi->adapter; 566 561 unsigned int v, addr, bpt, cpt; 567 - struct adapter *adap = to_net_dev(d)->priv; 562 + ssize_t len; 568 563 569 564 addr = A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2; 570 565 rtnl_lock(); ··· 588 581 static ssize_t tm_attr_store(struct device *d, struct device_attribute *attr, 589 582 const char *buf, size_t len, int sched) 590 583 { 584 + struct port_info *pi = netdev_priv(to_net_dev(d)); 585 + struct adapter *adap = pi->adapter; 586 + unsigned int val; 591 587 char *endp; 592 588 ssize_t ret; 593 - unsigned int val; 594 - struct adapter *adap = to_net_dev(d)->priv; 595 589 596 590 if (!capable(CAP_NET_ADMIN)) 597 591 return -EPERM; ··· 866 858 867 859 static int offload_open(struct net_device *dev) 868 860 { 869 - struct adapter *adapter = dev->priv; 870 - struct t3cdev *tdev = T3CDEV(dev); 861 + struct port_info *pi = netdev_priv(dev); 862 + struct adapter *adapter = pi->adapter; 863 + struct t3cdev *tdev = dev2t3cdev(dev); 871 864 int adap_up = adapter->open_device_map & PORT_MASK; 872 865 int err = 0; 873 866 ··· 933 924 934 925 static int cxgb_open(struct net_device *dev) 935 926 { 936 - int err; 937 - struct adapter *adapter = dev->priv; 938 927 struct port_info *pi = netdev_priv(dev); 928 + struct adapter *adapter = pi->adapter; 939 929 int other_ports = adapter->open_device_map & PORT_MASK; 930 + int err; 940 931 941 932 if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) 942 933 return err; ··· 960 951 961 952 static int cxgb_close(struct net_device *dev) 962 953 { 963 - struct adapter *adapter = dev->priv; 964 - struct port_info *p = netdev_priv(dev); 954 + struct port_info *pi = netdev_priv(dev); 955 + struct adapter *adapter = pi->adapter; 965 956 966 - t3_port_intr_disable(adapter, p->port_id); 957 + t3_port_intr_disable(adapter, pi->port_id); 967 958 netif_stop_queue(dev); 968 - p->phy.ops->power_down(&p->phy, 1); 959 + pi->phy.ops->power_down(&pi->phy, 1); 969 960 netif_carrier_off(dev); 970 - t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); 961 + t3_mac_disable(&pi->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); 971 962 972 963 spin_lock(&adapter->work_lock); /* sync with update task */ 973 - clear_bit(p->port_id, &adapter->open_device_map); 964 + clear_bit(pi->port_id, &adapter->open_device_map); 974 965 spin_unlock(&adapter->work_lock); 975 966 976 967 if (!(adapter->open_device_map & PORT_MASK)) ··· 985 976 986 977 static struct net_device_stats *cxgb_get_stats(struct net_device *dev) 987 978 { 988 - struct adapter *adapter = dev->priv; 989 - struct port_info *p = netdev_priv(dev); 990 - struct net_device_stats *ns = &p->netstats; 979 + struct port_info *pi = netdev_priv(dev); 980 + struct adapter *adapter = pi->adapter; 981 + struct net_device_stats *ns = &pi->netstats; 991 982 const struct mac_stats *pstats; 992 983 993 984 spin_lock(&adapter->stats_lock); 994 - pstats = t3_mac_update_stats(&p->mac); 985 + pstats = t3_mac_update_stats(&pi->mac); 995 986 spin_unlock(&adapter->stats_lock); 996 987 997 988 ns->tx_bytes = pstats->tx_octets; ··· 1024 1015 1025 1016 static u32 get_msglevel(struct net_device *dev) 1026 1017 { 1027 - struct adapter *adapter = dev->priv; 1018 + struct port_info *pi = netdev_priv(dev); 1019 + struct adapter *adapter = pi->adapter; 1028 1020 1029 1021 return adapter->msg_enable; 1030 1022 } 1031 1023 1032 1024 static void set_msglevel(struct net_device *dev, u32 val) 1033 1025 { 1034 - struct adapter *adapter = dev->priv; 1026 + struct port_info *pi = netdev_priv(dev); 1027 + struct adapter *adapter = pi->adapter; 1035 1028 1036 1029 adapter->msg_enable = val; 1037 1030 } ··· 1107 1096 1108 1097 static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 1109 1098 { 1099 + struct port_info *pi = netdev_priv(dev); 1100 + struct adapter *adapter = pi->adapter; 1110 1101 u32 fw_vers = 0; 1111 - struct adapter *adapter = dev->priv; 1112 1102 1113 1103 t3_get_fw_version(adapter, &fw_vers); 1114 1104 ··· 1148 1136 static void get_stats(struct net_device *dev, struct ethtool_stats *stats, 1149 1137 u64 *data) 1150 1138 { 1151 - struct adapter *adapter = dev->priv; 1152 1139 struct port_info *pi = netdev_priv(dev); 1140 + struct adapter *adapter = pi->adapter; 1153 1141 const struct mac_stats *s; 1154 1142 1155 1143 spin_lock(&adapter->stats_lock); ··· 1217 1205 static void get_regs(struct net_device *dev, struct ethtool_regs *regs, 1218 1206 void *buf) 1219 1207 { 1220 - struct adapter *ap = dev->priv; 1208 + struct port_info *pi = netdev_priv(dev); 1209 + struct adapter *ap = pi->adapter; 1221 1210 1222 1211 /* 1223 1212 * Version scheme: ··· 1259 1246 1260 1247 static int cxgb3_phys_id(struct net_device *dev, u32 data) 1261 1248 { 1249 + struct port_info *pi = netdev_priv(dev); 1250 + struct adapter *adapter = pi->adapter; 1262 1251 int i; 1263 - struct adapter *adapter = dev->priv; 1264 1252 1265 1253 if (data == 0) 1266 1254 data = 2; ··· 1422 1408 1423 1409 static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) 1424 1410 { 1425 - const struct adapter *adapter = dev->priv; 1426 - const struct port_info *pi = netdev_priv(dev); 1411 + struct port_info *pi = netdev_priv(dev); 1412 + struct adapter *adapter = pi->adapter; 1427 1413 const struct qset_params *q = &adapter->params.sge.qset[pi->first_qset]; 1428 1414 1429 1415 e->rx_max_pending = MAX_RX_BUFFERS; ··· 1439 1425 1440 1426 static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e) 1441 1427 { 1442 - int i; 1428 + struct port_info *pi = netdev_priv(dev); 1429 + struct adapter *adapter = pi->adapter; 1443 1430 struct qset_params *q; 1444 - struct adapter *adapter = dev->priv; 1445 - const struct port_info *pi = netdev_priv(dev); 1431 + int i; 1446 1432 1447 1433 if (e->rx_pending > MAX_RX_BUFFERS || 1448 1434 e->rx_jumbo_pending > MAX_RX_JUMBO_BUFFERS || ··· 1471 1457 1472 1458 static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c) 1473 1459 { 1474 - struct adapter *adapter = dev->priv; 1460 + struct port_info *pi = netdev_priv(dev); 1461 + struct adapter *adapter = pi->adapter; 1475 1462 struct qset_params *qsp = &adapter->params.sge.qset[0]; 1476 1463 struct sge_qset *qs = &adapter->sge.qs[0]; 1477 1464 ··· 1486 1471 1487 1472 static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) 1488 1473 { 1489 - struct adapter *adapter = dev->priv; 1474 + struct port_info *pi = netdev_priv(dev); 1475 + struct adapter *adapter = pi->adapter; 1490 1476 struct qset_params *q = adapter->params.sge.qset; 1491 1477 1492 1478 c->rx_coalesce_usecs = q->coalesce_usecs; ··· 1497 1481 static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e, 1498 1482 u8 * data) 1499 1483 { 1484 + struct port_info *pi = netdev_priv(dev); 1485 + struct adapter *adapter = pi->adapter; 1500 1486 int i, err = 0; 1501 - struct adapter *adapter = dev->priv; 1502 1487 1503 1488 u8 *buf = kmalloc(EEPROMSIZE, GFP_KERNEL); 1504 1489 if (!buf) ··· 1518 1501 static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, 1519 1502 u8 * data) 1520 1503 { 1504 + struct port_info *pi = netdev_priv(dev); 1505 + struct adapter *adapter = pi->adapter; 1506 + u32 aligned_offset, aligned_len, *p; 1521 1507 u8 *buf; 1522 1508 int err = 0; 1523 - u32 aligned_offset, aligned_len, *p; 1524 - struct adapter *adapter = dev->priv; 1525 1509 1526 1510 if (eeprom->magic != EEPROM_MAGIC) 1527 1511 return -EINVAL; ··· 1610 1592 1611 1593 static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) 1612 1594 { 1613 - int ret; 1595 + struct port_info *pi = netdev_priv(dev); 1596 + struct adapter *adapter = pi->adapter; 1614 1597 u32 cmd; 1615 - struct adapter *adapter = dev->priv; 1598 + int ret; 1616 1599 1617 1600 if (copy_from_user(&cmd, useraddr, sizeof(cmd))) 1618 1601 return -EFAULT; ··· 1942 1923 1943 1924 static int cxgb_ioctl(struct net_device *dev, struct ifreq *req, int cmd) 1944 1925 { 1945 - int ret, mmd; 1946 - struct adapter *adapter = dev->priv; 1947 - struct port_info *pi = netdev_priv(dev); 1948 1926 struct mii_ioctl_data *data = if_mii(req); 1927 + struct port_info *pi = netdev_priv(dev); 1928 + struct adapter *adapter = pi->adapter; 1929 + int ret, mmd; 1949 1930 1950 1931 switch (cmd) { 1951 1932 case SIOCGMIIPHY: ··· 2013 1994 2014 1995 static int cxgb_change_mtu(struct net_device *dev, int new_mtu) 2015 1996 { 2016 - int ret; 2017 - struct adapter *adapter = dev->priv; 2018 1997 struct port_info *pi = netdev_priv(dev); 1998 + struct adapter *adapter = pi->adapter; 1999 + int ret; 2019 2000 2020 2001 if (new_mtu < 81) /* accommodate SACK */ 2021 2002 return -EINVAL; ··· 2032 2013 2033 2014 static int cxgb_set_mac_addr(struct net_device *dev, void *p) 2034 2015 { 2035 - struct adapter *adapter = dev->priv; 2036 2016 struct port_info *pi = netdev_priv(dev); 2017 + struct adapter *adapter = pi->adapter; 2037 2018 struct sockaddr *addr = p; 2038 2019 2039 2020 if (!is_valid_ether_addr(addr->sa_data)) ··· 2069 2050 2070 2051 static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp) 2071 2052 { 2072 - struct adapter *adapter = dev->priv; 2073 2053 struct port_info *pi = netdev_priv(dev); 2054 + struct adapter *adapter = pi->adapter; 2074 2055 2075 2056 pi->vlan_grp = grp; 2076 2057 if (adapter->params.rev > 0) ··· 2089 2070 #ifdef CONFIG_NET_POLL_CONTROLLER 2090 2071 static void cxgb_netpoll(struct net_device *dev) 2091 2072 { 2092 - struct adapter *adapter = dev->priv; 2093 2073 struct port_info *pi = netdev_priv(dev); 2074 + struct adapter *adapter = pi->adapter; 2094 2075 int qidx; 2095 2076 2096 2077 for (qidx = pi->first_qset; qidx < pi->first_qset + pi->nqsets; qidx++) { ··· 2452 2433 2453 2434 adapter->port[i] = netdev; 2454 2435 pi = netdev_priv(netdev); 2436 + pi->adapter = adapter; 2455 2437 pi->rx_csum_offload = 1; 2456 2438 pi->nqsets = 1; 2457 2439 pi->first_qset = i; ··· 2462 2442 netdev->irq = pdev->irq; 2463 2443 netdev->mem_start = mmio_start; 2464 2444 netdev->mem_end = mmio_start + mmio_len - 1; 2465 - netdev->priv = adapter; 2466 2445 netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; 2467 2446 netdev->features |= NETIF_F_LLTX; 2468 2447 if (pci_using_dac) ··· 2486 2467 SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops); 2487 2468 } 2488 2469 2489 - pci_set_drvdata(pdev, adapter->port[0]); 2470 + pci_set_drvdata(pdev, adapter); 2490 2471 if (t3_prep_adapter(adapter, ai, 1) < 0) { 2491 2472 err = -ENODEV; 2492 2473 goto out_free_dev; ··· 2566 2547 2567 2548 static void __devexit remove_one(struct pci_dev *pdev) 2568 2549 { 2569 - struct net_device *dev = pci_get_drvdata(pdev); 2550 + struct adapter *adapter = pci_get_drvdata(pdev); 2570 2551 2571 - if (dev) { 2552 + if (adapter) { 2572 2553 int i; 2573 - struct adapter *adapter = dev->priv; 2574 2554 2575 2555 t3_sge_stop(adapter); 2576 2556 sysfs_remove_group(&adapter->port[0]->dev.kobj,
+13 -3
drivers/net/cxgb3/cxgb3_offload.c
··· 593 593 594 594 EXPORT_SYMBOL(cxgb3_alloc_stid); 595 595 596 + /* Get the t3cdev associated with a net_device */ 597 + struct t3cdev *dev2t3cdev(struct net_device *dev) 598 + { 599 + const struct port_info *pi = netdev_priv(dev); 600 + 601 + return (struct t3cdev *)pi->adapter; 602 + } 603 + 604 + EXPORT_SYMBOL(dev2t3cdev); 605 + 596 606 static int do_smt_write_rpl(struct t3cdev *dev, struct sk_buff *skb) 597 607 { 598 608 struct cpl_smt_write_rpl *rpl = cplhdr(skb); ··· 935 925 struct net_device *dev = neigh->dev; 936 926 937 927 if (dev && (is_offloading(dev))) { 938 - struct t3cdev *tdev = T3CDEV(dev); 928 + struct t3cdev *tdev = dev2t3cdev(dev); 939 929 940 930 BUG_ON(!tdev); 941 931 t3_l2t_update(tdev, neigh); ··· 983 973 "device ignored.\n", __FUNCTION__); 984 974 return; 985 975 } 986 - tdev = T3CDEV(olddev); 976 + tdev = dev2t3cdev(olddev); 987 977 BUG_ON(!tdev); 988 - if (tdev != T3CDEV(newdev)) { 978 + if (tdev != dev2t3cdev(newdev)) { 989 979 printk(KERN_WARNING "%s: Redirect to different " 990 980 "offload device ignored.\n", __FUNCTION__); 991 981 return;
+2
drivers/net/cxgb3/cxgb3_offload.h
··· 51 51 52 52 void cxgb3_set_dummy_ops(struct t3cdev *dev); 53 53 54 + struct t3cdev *dev2t3cdev(struct net_device *dev); 55 + 54 56 /* 55 57 * Client registration. Users of T3 driver must register themselves. 56 58 * The T3 driver will call the add function of every client for each T3
+15 -8
drivers/net/cxgb3/sge.c
··· 1073 1073 { 1074 1074 unsigned int ndesc, pidx, credits, gen, compl; 1075 1075 const struct port_info *pi = netdev_priv(dev); 1076 - struct adapter *adap = dev->priv; 1076 + struct adapter *adap = pi->adapter; 1077 1077 struct sge_qset *qs = dev2qset(dev); 1078 1078 struct sge_txq *q = &qs->txq[TXQ_ETH]; 1079 1079 ··· 1326 1326 struct sk_buff *skb; 1327 1327 struct sge_qset *qs = (struct sge_qset *)data; 1328 1328 struct sge_txq *q = &qs->txq[TXQ_CTRL]; 1329 - struct adapter *adap = qs->netdev->priv; 1329 + const struct port_info *pi = netdev_priv(qs->netdev); 1330 + struct adapter *adap = pi->adapter; 1330 1331 1331 1332 spin_lock(&q->lock); 1332 1333 again:reclaim_completed_tx_imm(q); ··· 1532 1531 struct sk_buff *skb; 1533 1532 struct sge_qset *qs = (struct sge_qset *)data; 1534 1533 struct sge_txq *q = &qs->txq[TXQ_OFLD]; 1535 - struct adapter *adap = qs->netdev->priv; 1534 + const struct port_info *pi = netdev_priv(qs->netdev); 1535 + struct adapter *adap = pi->adapter; 1536 1536 1537 1537 spin_lock(&q->lock); 1538 1538 again:reclaim_completed_tx(adap, q); ··· 1677 1675 */ 1678 1676 static int ofld_poll(struct net_device *dev, int *budget) 1679 1677 { 1680 - struct adapter *adapter = dev->priv; 1678 + const struct port_info *pi = netdev_priv(dev); 1679 + struct adapter *adapter = pi->adapter; 1681 1680 struct sge_qset *qs = dev2qset(dev); 1682 1681 struct sge_rspq *q = &qs->rspq; 1683 1682 int work_done, limit = min(*budget, dev->quota), avail = limit; ··· 2078 2075 */ 2079 2076 static int napi_rx_handler(struct net_device *dev, int *budget) 2080 2077 { 2081 - struct adapter *adap = dev->priv; 2078 + const struct port_info *pi = netdev_priv(dev); 2079 + struct adapter *adap = pi->adapter; 2082 2080 struct sge_qset *qs = dev2qset(dev); 2083 2081 int effective_budget = min(*budget, dev->quota); 2084 2082 ··· 2209 2205 irqreturn_t t3_sge_intr_msix(int irq, void *cookie) 2210 2206 { 2211 2207 struct sge_qset *qs = cookie; 2212 - struct adapter *adap = qs->netdev->priv; 2208 + const struct port_info *pi = netdev_priv(qs->netdev); 2209 + struct adapter *adap = pi->adapter; 2213 2210 struct sge_rspq *q = &qs->rspq; 2214 2211 2215 2212 spin_lock(&q->lock); ··· 2229 2224 irqreturn_t t3_sge_intr_msix_napi(int irq, void *cookie) 2230 2225 { 2231 2226 struct sge_qset *qs = cookie; 2232 - struct adapter *adap = qs->netdev->priv; 2227 + const struct port_info *pi = netdev_priv(qs->netdev); 2228 + struct adapter *adap = pi->adapter; 2233 2229 struct sge_rspq *q = &qs->rspq; 2234 2230 2235 2231 spin_lock(&q->lock); ··· 2514 2508 { 2515 2509 spinlock_t *lock; 2516 2510 struct sge_qset *qs = (struct sge_qset *)data; 2517 - struct adapter *adap = qs->netdev->priv; 2511 + const struct port_info *pi = netdev_priv(qs->netdev); 2512 + struct adapter *adap = pi->adapter; 2518 2513 2519 2514 if (spin_trylock(&qs->txq[TXQ_ETH].lock)) { 2520 2515 reclaim_completed_tx(adap, &qs->txq[TXQ_ETH]);
-3
drivers/net/cxgb3/t3cdev.h
··· 42 42 43 43 #define T3CNAMSIZ 16 44 44 45 - /* Get the t3cdev associated with a net_device */ 46 - #define T3CDEV(netdev) (struct t3cdev *)(netdev->priv) 47 - 48 45 struct cxgb3_client; 49 46 50 47 enum t3ctype {