.. | .. |
---|
66 | 66 | #include <uapi/linux/net_tstamp.h> |
---|
67 | 67 | #include <linux/ptp_clock_kernel.h> |
---|
68 | 68 | |
---|
69 | | -#ifdef CONFIG_SPARC |
---|
70 | | -#include <asm/idprom.h> |
---|
71 | | -#include <asm/prom.h> |
---|
72 | | -#endif |
---|
73 | | - |
---|
74 | 69 | #define BAR_0 0 |
---|
75 | 70 | #define BAR_2 2 |
---|
76 | 71 | |
---|
.. | .. |
---|
101 | 96 | _tg3_flag_clear(TG3_FLAG_##flag, (tp)->tg3_flags) |
---|
102 | 97 | |
---|
103 | 98 | #define DRV_MODULE_NAME "tg3" |
---|
| 99 | +/* DO NOT UPDATE TG3_*_NUM defines */ |
---|
104 | 100 | #define TG3_MAJ_NUM 3 |
---|
105 | 101 | #define TG3_MIN_NUM 137 |
---|
106 | | -#define DRV_MODULE_VERSION \ |
---|
107 | | - __stringify(TG3_MAJ_NUM) "." __stringify(TG3_MIN_NUM) |
---|
108 | | -#define DRV_MODULE_RELDATE "May 11, 2014" |
---|
109 | 102 | |
---|
110 | 103 | #define RESET_KIND_SHUTDOWN 0 |
---|
111 | 104 | #define RESET_KIND_INIT 1 |
---|
.. | .. |
---|
227 | 220 | #define FIRMWARE_TG3TSO "tigon/tg3_tso.bin" |
---|
228 | 221 | #define FIRMWARE_TG3TSO5 "tigon/tg3_tso5.bin" |
---|
229 | 222 | |
---|
230 | | -static char version[] = |
---|
231 | | - DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")"; |
---|
232 | | - |
---|
233 | 223 | MODULE_AUTHOR("David S. Miller (davem@redhat.com) and Jeff Garzik (jgarzik@pobox.com)"); |
---|
234 | 224 | MODULE_DESCRIPTION("Broadcom Tigon3 ethernet driver"); |
---|
235 | 225 | MODULE_LICENSE("GPL"); |
---|
236 | | -MODULE_VERSION(DRV_MODULE_VERSION); |
---|
237 | 226 | MODULE_FIRMWARE(FIRMWARE_TG3); |
---|
| 227 | +MODULE_FIRMWARE(FIRMWARE_TG357766); |
---|
238 | 228 | MODULE_FIRMWARE(FIRMWARE_TG3TSO); |
---|
239 | 229 | MODULE_FIRMWARE(FIRMWARE_TG3TSO5); |
---|
240 | 230 | |
---|
.. | .. |
---|
726 | 716 | case TG3_APE_LOCK_GPIO: |
---|
727 | 717 | if (tg3_asic_rev(tp) == ASIC_REV_5761) |
---|
728 | 718 | return 0; |
---|
729 | | - /* else: fall through */ |
---|
| 719 | + fallthrough; |
---|
730 | 720 | case TG3_APE_LOCK_GRC: |
---|
731 | 721 | case TG3_APE_LOCK_MEM: |
---|
732 | 722 | if (!tp->pci_fn) |
---|
.. | .. |
---|
787 | 777 | case TG3_APE_LOCK_GPIO: |
---|
788 | 778 | if (tg3_asic_rev(tp) == ASIC_REV_5761) |
---|
789 | 779 | return; |
---|
790 | | - /* else: fall through */ |
---|
| 780 | + fallthrough; |
---|
791 | 781 | case TG3_APE_LOCK_GRC: |
---|
792 | 782 | case TG3_APE_LOCK_MEM: |
---|
793 | 783 | if (!tp->pci_fn) |
---|
.. | .. |
---|
1078 | 1068 | struct tg3 *tp = tnapi->tp; |
---|
1079 | 1069 | |
---|
1080 | 1070 | tw32_mailbox(tnapi->int_mbox, tnapi->last_tag << 24); |
---|
1081 | | - mmiowb(); |
---|
1082 | 1071 | |
---|
1083 | 1072 | /* When doing tagged status, this work check is unnecessary. |
---|
1084 | 1073 | * The last_tag we write above tells the chip which piece of |
---|
.. | .. |
---|
1598 | 1587 | phydev->dev_flags |= PHY_BRCM_EXT_IBND_RX_ENABLE; |
---|
1599 | 1588 | if (tg3_flag(tp, RGMII_EXT_IBND_TX_EN)) |
---|
1600 | 1589 | phydev->dev_flags |= PHY_BRCM_EXT_IBND_TX_ENABLE; |
---|
1601 | | - /* fallthru */ |
---|
| 1590 | + fallthrough; |
---|
1602 | 1591 | case PHY_ID_RTL8211C: |
---|
1603 | 1592 | phydev->interface = PHY_INTERFACE_MODE_RGMII; |
---|
1604 | 1593 | break; |
---|
.. | .. |
---|
2122 | 2111 | case PHY_INTERFACE_MODE_GMII: |
---|
2123 | 2112 | case PHY_INTERFACE_MODE_RGMII: |
---|
2124 | 2113 | if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { |
---|
2125 | | - phydev->supported &= (PHY_GBIT_FEATURES | |
---|
2126 | | - SUPPORTED_Pause | |
---|
2127 | | - SUPPORTED_Asym_Pause); |
---|
| 2114 | + phy_set_max_speed(phydev, SPEED_1000); |
---|
| 2115 | + phy_support_asym_pause(phydev); |
---|
2128 | 2116 | break; |
---|
2129 | 2117 | } |
---|
2130 | | - /* fallthru */ |
---|
| 2118 | + fallthrough; |
---|
2131 | 2119 | case PHY_INTERFACE_MODE_MII: |
---|
2132 | | - phydev->supported &= (PHY_BASIC_FEATURES | |
---|
2133 | | - SUPPORTED_Pause | |
---|
2134 | | - SUPPORTED_Asym_Pause); |
---|
| 2120 | + phy_set_max_speed(phydev, SPEED_100); |
---|
| 2121 | + phy_support_asym_pause(phydev); |
---|
2135 | 2122 | break; |
---|
2136 | 2123 | default: |
---|
2137 | 2124 | phy_disconnect(mdiobus_get_phy(tp->mdio_bus, tp->phy_addr)); |
---|
.. | .. |
---|
2139 | 2126 | } |
---|
2140 | 2127 | |
---|
2141 | 2128 | tp->phy_flags |= TG3_PHYFLG_IS_CONNECTED; |
---|
2142 | | - |
---|
2143 | | - phydev->advertising = phydev->supported; |
---|
2144 | 2129 | |
---|
2145 | 2130 | phy_attached_info(phydev); |
---|
2146 | 2131 | |
---|
.. | .. |
---|
2161 | 2146 | phydev->speed = tp->link_config.speed; |
---|
2162 | 2147 | phydev->duplex = tp->link_config.duplex; |
---|
2163 | 2148 | phydev->autoneg = tp->link_config.autoneg; |
---|
2164 | | - phydev->advertising = tp->link_config.advertising; |
---|
| 2149 | + ethtool_convert_legacy_u32_to_link_mode( |
---|
| 2150 | + phydev->advertising, tp->link_config.advertising); |
---|
2165 | 2151 | } |
---|
2166 | 2152 | |
---|
2167 | 2153 | phy_start(phydev); |
---|
.. | .. |
---|
4061 | 4047 | do_low_power = false; |
---|
4062 | 4048 | if ((tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) && |
---|
4063 | 4049 | !(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) { |
---|
| 4050 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising) = { 0, }; |
---|
4064 | 4051 | struct phy_device *phydev; |
---|
4065 | | - u32 phyid, advertising; |
---|
| 4052 | + u32 phyid; |
---|
4066 | 4053 | |
---|
4067 | 4054 | phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); |
---|
4068 | 4055 | |
---|
.. | .. |
---|
4071 | 4058 | tp->link_config.speed = phydev->speed; |
---|
4072 | 4059 | tp->link_config.duplex = phydev->duplex; |
---|
4073 | 4060 | tp->link_config.autoneg = phydev->autoneg; |
---|
4074 | | - tp->link_config.advertising = phydev->advertising; |
---|
| 4061 | + ethtool_convert_link_mode_to_legacy_u32( |
---|
| 4062 | + &tp->link_config.advertising, |
---|
| 4063 | + phydev->advertising); |
---|
4075 | 4064 | |
---|
4076 | | - advertising = ADVERTISED_TP | |
---|
4077 | | - ADVERTISED_Pause | |
---|
4078 | | - ADVERTISED_Autoneg | |
---|
4079 | | - ADVERTISED_10baseT_Half; |
---|
| 4065 | + linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, advertising); |
---|
| 4066 | + linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, |
---|
| 4067 | + advertising); |
---|
| 4068 | + linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, |
---|
| 4069 | + advertising); |
---|
| 4070 | + linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, |
---|
| 4071 | + advertising); |
---|
4080 | 4072 | |
---|
4081 | 4073 | if (tg3_flag(tp, ENABLE_ASF) || device_should_wake) { |
---|
4082 | | - if (tg3_flag(tp, WOL_SPEED_100MB)) |
---|
4083 | | - advertising |= |
---|
4084 | | - ADVERTISED_100baseT_Half | |
---|
4085 | | - ADVERTISED_100baseT_Full | |
---|
4086 | | - ADVERTISED_10baseT_Full; |
---|
4087 | | - else |
---|
4088 | | - advertising |= ADVERTISED_10baseT_Full; |
---|
| 4074 | + if (tg3_flag(tp, WOL_SPEED_100MB)) { |
---|
| 4075 | + linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, |
---|
| 4076 | + advertising); |
---|
| 4077 | + linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, |
---|
| 4078 | + advertising); |
---|
| 4079 | + linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, |
---|
| 4080 | + advertising); |
---|
| 4081 | + } else { |
---|
| 4082 | + linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, |
---|
| 4083 | + advertising); |
---|
| 4084 | + } |
---|
4089 | 4085 | } |
---|
4090 | 4086 | |
---|
4091 | | - phydev->advertising = advertising; |
---|
4092 | | - |
---|
| 4087 | + linkmode_copy(phydev->advertising, advertising); |
---|
4093 | 4088 | phy_start_aneg(phydev); |
---|
4094 | 4089 | |
---|
4095 | 4090 | phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask; |
---|
.. | .. |
---|
4282 | 4277 | pci_set_power_state(tp->pdev, PCI_D3hot); |
---|
4283 | 4278 | } |
---|
4284 | 4279 | |
---|
4285 | | -static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex) |
---|
| 4280 | +static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u32 *speed, u8 *duplex) |
---|
4286 | 4281 | { |
---|
4287 | 4282 | switch (val & MII_TG3_AUX_STAT_SPDMASK) { |
---|
4288 | 4283 | case MII_TG3_AUX_STAT_10HALF: |
---|
.. | .. |
---|
4396 | 4391 | MII_TG3_DSP_TAP26_RMRXSTO | |
---|
4397 | 4392 | MII_TG3_DSP_TAP26_OPCSINPT; |
---|
4398 | 4393 | tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, val); |
---|
4399 | | - /* Fall through */ |
---|
| 4394 | + fallthrough; |
---|
4400 | 4395 | case ASIC_REV_5720: |
---|
4401 | 4396 | case ASIC_REV_5762: |
---|
4402 | 4397 | if (!tg3_phydsp_read(tp, MII_TG3_DSP_CH34TP2, &val)) |
---|
.. | .. |
---|
4544 | 4539 | tp->link_config.speed = SPEED_1000; |
---|
4545 | 4540 | break; |
---|
4546 | 4541 | } |
---|
4547 | | - /* Fall through */ |
---|
| 4542 | + fallthrough; |
---|
4548 | 4543 | default: |
---|
4549 | 4544 | goto done; |
---|
4550 | 4545 | } |
---|
.. | .. |
---|
4786 | 4781 | bool current_link_up; |
---|
4787 | 4782 | u32 bmsr, val; |
---|
4788 | 4783 | u32 lcl_adv, rmt_adv; |
---|
4789 | | - u16 current_speed; |
---|
| 4784 | + u32 current_speed; |
---|
4790 | 4785 | u8 current_duplex; |
---|
4791 | 4786 | int i, err; |
---|
4792 | 4787 | |
---|
.. | .. |
---|
5215 | 5210 | if (ap->flags & (MR_AN_ENABLE | MR_RESTART_AN)) |
---|
5216 | 5211 | ap->state = ANEG_STATE_AN_ENABLE; |
---|
5217 | 5212 | |
---|
5218 | | - /* fallthru */ |
---|
| 5213 | + fallthrough; |
---|
5219 | 5214 | case ANEG_STATE_AN_ENABLE: |
---|
5220 | 5215 | ap->flags &= ~(MR_AN_COMPLETE | MR_PAGE_RX); |
---|
5221 | 5216 | if (ap->flags & MR_AN_ENABLE) { |
---|
.. | .. |
---|
5245 | 5240 | ret = ANEG_TIMER_ENAB; |
---|
5246 | 5241 | ap->state = ANEG_STATE_RESTART; |
---|
5247 | 5242 | |
---|
5248 | | - /* fallthru */ |
---|
| 5243 | + fallthrough; |
---|
5249 | 5244 | case ANEG_STATE_RESTART: |
---|
5250 | 5245 | delta = ap->cur_time - ap->link_time; |
---|
5251 | 5246 | if (delta > ANEG_STATE_SETTLE_TIME) |
---|
.. | .. |
---|
5288 | 5283 | |
---|
5289 | 5284 | ap->state = ANEG_STATE_ACK_DETECT; |
---|
5290 | 5285 | |
---|
5291 | | - /* fallthru */ |
---|
| 5286 | + fallthrough; |
---|
5292 | 5287 | case ANEG_STATE_ACK_DETECT: |
---|
5293 | 5288 | if (ap->ack_match != 0) { |
---|
5294 | 5289 | if ((ap->rxconfig & ~ANEG_CFG_ACK) == |
---|
.. | .. |
---|
5718 | 5713 | static int tg3_setup_fiber_phy(struct tg3 *tp, bool force_reset) |
---|
5719 | 5714 | { |
---|
5720 | 5715 | u32 orig_pause_cfg; |
---|
5721 | | - u16 orig_active_speed; |
---|
| 5716 | + u32 orig_active_speed; |
---|
5722 | 5717 | u8 orig_active_duplex; |
---|
5723 | 5718 | u32 mac_status; |
---|
5724 | 5719 | bool current_link_up; |
---|
.. | .. |
---|
5822 | 5817 | { |
---|
5823 | 5818 | int err = 0; |
---|
5824 | 5819 | u32 bmsr, bmcr; |
---|
5825 | | - u16 current_speed = SPEED_UNKNOWN; |
---|
| 5820 | + u32 current_speed = SPEED_UNKNOWN; |
---|
5826 | 5821 | u8 current_duplex = DUPLEX_UNKNOWN; |
---|
5827 | 5822 | bool current_link_up = false; |
---|
5828 | 5823 | u32 local_adv, remote_adv, sgsr; |
---|
.. | .. |
---|
6139 | 6134 | } |
---|
6140 | 6135 | |
---|
6141 | 6136 | /* tp->lock must be held */ |
---|
6142 | | -static u64 tg3_refclk_read(struct tg3 *tp) |
---|
| 6137 | +static u64 tg3_refclk_read(struct tg3 *tp, struct ptp_system_timestamp *sts) |
---|
6143 | 6138 | { |
---|
6144 | | - u64 stamp = tr32(TG3_EAV_REF_CLCK_LSB); |
---|
6145 | | - return stamp | (u64)tr32(TG3_EAV_REF_CLCK_MSB) << 32; |
---|
| 6139 | + u64 stamp; |
---|
| 6140 | + |
---|
| 6141 | + ptp_read_system_prets(sts); |
---|
| 6142 | + stamp = tr32(TG3_EAV_REF_CLCK_LSB); |
---|
| 6143 | + ptp_read_system_postts(sts); |
---|
| 6144 | + stamp |= (u64)tr32(TG3_EAV_REF_CLCK_MSB) << 32; |
---|
| 6145 | + |
---|
| 6146 | + return stamp; |
---|
6146 | 6147 | } |
---|
6147 | 6148 | |
---|
6148 | 6149 | /* tp->lock must be held */ |
---|
.. | .. |
---|
6233 | 6234 | return 0; |
---|
6234 | 6235 | } |
---|
6235 | 6236 | |
---|
6236 | | -static int tg3_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) |
---|
| 6237 | +static int tg3_ptp_gettimex(struct ptp_clock_info *ptp, struct timespec64 *ts, |
---|
| 6238 | + struct ptp_system_timestamp *sts) |
---|
6237 | 6239 | { |
---|
6238 | 6240 | u64 ns; |
---|
6239 | 6241 | struct tg3 *tp = container_of(ptp, struct tg3, ptp_info); |
---|
6240 | 6242 | |
---|
6241 | 6243 | tg3_full_lock(tp, 0); |
---|
6242 | | - ns = tg3_refclk_read(tp); |
---|
| 6244 | + ns = tg3_refclk_read(tp, sts); |
---|
6243 | 6245 | ns += tp->ptp_adjust; |
---|
6244 | 6246 | tg3_full_unlock(tp); |
---|
6245 | 6247 | |
---|
.. | .. |
---|
6273 | 6275 | |
---|
6274 | 6276 | switch (rq->type) { |
---|
6275 | 6277 | case PTP_CLK_REQ_PEROUT: |
---|
| 6278 | + /* Reject requests with unsupported flags */ |
---|
| 6279 | + if (rq->perout.flags) |
---|
| 6280 | + return -EOPNOTSUPP; |
---|
| 6281 | + |
---|
6276 | 6282 | if (rq->perout.index != 0) |
---|
6277 | 6283 | return -EINVAL; |
---|
6278 | 6284 | |
---|
.. | .. |
---|
6334 | 6340 | .pps = 0, |
---|
6335 | 6341 | .adjfreq = tg3_ptp_adjfreq, |
---|
6336 | 6342 | .adjtime = tg3_ptp_adjtime, |
---|
6337 | | - .gettime64 = tg3_ptp_gettime, |
---|
| 6343 | + .gettimex64 = tg3_ptp_gettimex, |
---|
6338 | 6344 | .settime64 = tg3_ptp_settime, |
---|
6339 | 6345 | .enable = tg3_ptp_enable, |
---|
6340 | 6346 | }; |
---|
.. | .. |
---|
6703 | 6709 | skb_size = SKB_DATA_ALIGN(data_size + TG3_RX_OFFSET(tp)) + |
---|
6704 | 6710 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); |
---|
6705 | 6711 | if (skb_size <= PAGE_SIZE) { |
---|
6706 | | - data = netdev_alloc_frag(skb_size); |
---|
| 6712 | + data = napi_alloc_frag(skb_size); |
---|
6707 | 6713 | *frag_size = skb_size; |
---|
6708 | 6714 | } else { |
---|
6709 | 6715 | data = kmalloc(skb_size, GFP_ATOMIC); |
---|
.. | .. |
---|
6991 | 6997 | tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG, |
---|
6992 | 6998 | tpr->rx_jmb_prod_idx); |
---|
6993 | 6999 | } |
---|
6994 | | - mmiowb(); |
---|
6995 | 7000 | } else if (work_mask) { |
---|
6996 | 7001 | /* rx_std_buffers[] and rx_jmb_buffers[] entries must be |
---|
6997 | 7002 | * updated before the producer indices can be updated. |
---|
.. | .. |
---|
7202 | 7207 | tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG, |
---|
7203 | 7208 | dpr->rx_jmb_prod_idx); |
---|
7204 | 7209 | |
---|
7205 | | - mmiowb(); |
---|
7206 | | - |
---|
7207 | 7210 | if (err) |
---|
7208 | 7211 | tw32_f(HOSTCC_MODE, tp->coal_now); |
---|
7209 | 7212 | } |
---|
.. | .. |
---|
7270 | 7273 | HOSTCC_MODE_ENABLE | |
---|
7271 | 7274 | tnapi->coal_now); |
---|
7272 | 7275 | } |
---|
7273 | | - mmiowb(); |
---|
7274 | 7276 | break; |
---|
7275 | 7277 | } |
---|
7276 | 7278 | } |
---|
.. | .. |
---|
7638 | 7640 | } |
---|
7639 | 7641 | #endif |
---|
7640 | 7642 | |
---|
7641 | | -static void tg3_tx_timeout(struct net_device *dev) |
---|
| 7643 | +static void tg3_tx_timeout(struct net_device *dev, unsigned int txqueue) |
---|
7642 | 7644 | { |
---|
7643 | 7645 | struct tg3 *tp = netdev_priv(dev); |
---|
7644 | 7646 | |
---|
.. | .. |
---|
7867 | 7869 | static int tg3_tso_bug(struct tg3 *tp, struct tg3_napi *tnapi, |
---|
7868 | 7870 | struct netdev_queue *txq, struct sk_buff *skb) |
---|
7869 | 7871 | { |
---|
7870 | | - struct sk_buff *segs, *nskb; |
---|
7871 | 7872 | u32 frag_cnt_est = skb_shinfo(skb)->gso_segs * 3; |
---|
| 7873 | + struct sk_buff *segs, *seg, *next; |
---|
7872 | 7874 | |
---|
7873 | 7875 | /* Estimate the number of fragments in the worst case */ |
---|
7874 | 7876 | if (unlikely(tg3_tx_avail(tnapi) <= frag_cnt_est)) { |
---|
.. | .. |
---|
7891 | 7893 | if (IS_ERR(segs) || !segs) |
---|
7892 | 7894 | goto tg3_tso_bug_end; |
---|
7893 | 7895 | |
---|
7894 | | - do { |
---|
7895 | | - nskb = segs; |
---|
7896 | | - segs = segs->next; |
---|
7897 | | - nskb->next = NULL; |
---|
7898 | | - tg3_start_xmit(nskb, tp->dev); |
---|
7899 | | - } while (segs); |
---|
| 7896 | + skb_list_walk_safe(segs, seg, next) { |
---|
| 7897 | + skb_mark_not_on_list(seg); |
---|
| 7898 | + tg3_start_xmit(seg, tp->dev); |
---|
| 7899 | + } |
---|
7900 | 7900 | |
---|
7901 | 7901 | tg3_tso_bug_end: |
---|
7902 | 7902 | dev_consume_skb_any(skb); |
---|
.. | .. |
---|
8148 | 8148 | netif_tx_wake_queue(txq); |
---|
8149 | 8149 | } |
---|
8150 | 8150 | |
---|
8151 | | - if (!skb->xmit_more || netif_xmit_stopped(txq)) { |
---|
| 8151 | + if (!netdev_xmit_more() || netif_xmit_stopped(txq)) { |
---|
8152 | 8152 | /* Packets are ready, update Tx producer idx on card. */ |
---|
8153 | 8153 | tw32_tx_mbox(tnapi->prodmbox, entry); |
---|
8154 | | - mmiowb(); |
---|
8155 | 8154 | } |
---|
8156 | 8155 | |
---|
8157 | 8156 | return NETDEV_TX_OK; |
---|
.. | .. |
---|
8704 | 8703 | if (!i && tg3_flag(tp, ENABLE_RSS)) |
---|
8705 | 8704 | continue; |
---|
8706 | 8705 | |
---|
8707 | | - tnapi->rx_rcb = dma_zalloc_coherent(&tp->pdev->dev, |
---|
8708 | | - TG3_RX_RCB_RING_BYTES(tp), |
---|
8709 | | - &tnapi->rx_rcb_mapping, |
---|
8710 | | - GFP_KERNEL); |
---|
| 8706 | + tnapi->rx_rcb = dma_alloc_coherent(&tp->pdev->dev, |
---|
| 8707 | + TG3_RX_RCB_RING_BYTES(tp), |
---|
| 8708 | + &tnapi->rx_rcb_mapping, |
---|
| 8709 | + GFP_KERNEL); |
---|
8711 | 8710 | if (!tnapi->rx_rcb) |
---|
8712 | 8711 | goto err_out; |
---|
8713 | 8712 | } |
---|
.. | .. |
---|
8760 | 8759 | { |
---|
8761 | 8760 | int i; |
---|
8762 | 8761 | |
---|
8763 | | - tp->hw_stats = dma_zalloc_coherent(&tp->pdev->dev, |
---|
8764 | | - sizeof(struct tg3_hw_stats), |
---|
8765 | | - &tp->stats_mapping, GFP_KERNEL); |
---|
| 8762 | + tp->hw_stats = dma_alloc_coherent(&tp->pdev->dev, |
---|
| 8763 | + sizeof(struct tg3_hw_stats), |
---|
| 8764 | + &tp->stats_mapping, GFP_KERNEL); |
---|
8766 | 8765 | if (!tp->hw_stats) |
---|
8767 | 8766 | goto err_out; |
---|
8768 | 8767 | |
---|
.. | .. |
---|
8770 | 8769 | struct tg3_napi *tnapi = &tp->napi[i]; |
---|
8771 | 8770 | struct tg3_hw_status *sblk; |
---|
8772 | 8771 | |
---|
8773 | | - tnapi->hw_status = dma_zalloc_coherent(&tp->pdev->dev, |
---|
8774 | | - TG3_HW_STATUS_SIZE, |
---|
8775 | | - &tnapi->status_mapping, |
---|
8776 | | - GFP_KERNEL); |
---|
| 8772 | + tnapi->hw_status = dma_alloc_coherent(&tp->pdev->dev, |
---|
| 8773 | + TG3_HW_STATUS_SIZE, |
---|
| 8774 | + &tnapi->status_mapping, |
---|
| 8775 | + GFP_KERNEL); |
---|
8777 | 8776 | if (!tnapi->hw_status) |
---|
8778 | 8777 | goto err_out; |
---|
8779 | 8778 | |
---|
.. | .. |
---|
10722 | 10721 | switch (limit) { |
---|
10723 | 10722 | case 16: |
---|
10724 | 10723 | tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0); |
---|
10725 | | - /* fall through */ |
---|
| 10724 | + fallthrough; |
---|
10726 | 10725 | case 15: |
---|
10727 | 10726 | tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0); |
---|
10728 | | - /* fall through */ |
---|
| 10727 | + fallthrough; |
---|
10729 | 10728 | case 14: |
---|
10730 | 10729 | tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0); |
---|
10731 | | - /* fall through */ |
---|
| 10730 | + fallthrough; |
---|
10732 | 10731 | case 13: |
---|
10733 | 10732 | tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0); |
---|
10734 | | - /* fall through */ |
---|
| 10733 | + fallthrough; |
---|
10735 | 10734 | case 12: |
---|
10736 | 10735 | tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0); |
---|
10737 | | - /* fall through */ |
---|
| 10736 | + fallthrough; |
---|
10738 | 10737 | case 11: |
---|
10739 | 10738 | tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0); |
---|
10740 | | - /* fall through */ |
---|
| 10739 | + fallthrough; |
---|
10741 | 10740 | case 10: |
---|
10742 | 10741 | tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0); |
---|
10743 | | - /* fall through */ |
---|
| 10742 | + fallthrough; |
---|
10744 | 10743 | case 9: |
---|
10745 | 10744 | tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0); |
---|
10746 | | - /* fall through */ |
---|
| 10745 | + fallthrough; |
---|
10747 | 10746 | case 8: |
---|
10748 | 10747 | tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0); |
---|
10749 | | - /* fall through */ |
---|
| 10748 | + fallthrough; |
---|
10750 | 10749 | case 7: |
---|
10751 | 10750 | tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0); |
---|
10752 | | - /* fall through */ |
---|
| 10751 | + fallthrough; |
---|
10753 | 10752 | case 6: |
---|
10754 | 10753 | tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0); |
---|
10755 | | - /* fall through */ |
---|
| 10754 | + fallthrough; |
---|
10756 | 10755 | case 5: |
---|
10757 | 10756 | tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0); |
---|
10758 | | - /* fall through */ |
---|
| 10757 | + fallthrough; |
---|
10759 | 10758 | case 4: |
---|
10760 | 10759 | /* tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); */ |
---|
10761 | 10760 | case 3: |
---|
.. | .. |
---|
10799 | 10798 | #ifdef CONFIG_TIGON3_HWMON |
---|
10800 | 10799 | static void tg3_sd_scan_scratchpad(struct tg3 *tp, struct tg3_ocir *ocir) |
---|
10801 | 10800 | { |
---|
| 10801 | + u32 off, len = TG3_OCIR_LEN; |
---|
10802 | 10802 | int i; |
---|
10803 | 10803 | |
---|
10804 | | - for (i = 0; i < TG3_SD_NUM_RECS; i++, ocir++) { |
---|
10805 | | - u32 off = i * TG3_OCIR_LEN, len = TG3_OCIR_LEN; |
---|
10806 | | - |
---|
| 10804 | + for (i = 0, off = 0; i < TG3_SD_NUM_RECS; i++, ocir++, off += len) { |
---|
10807 | 10805 | tg3_ape_scratchpad_read(tp, (u32 *) ocir, off, len); |
---|
10808 | | - off += len; |
---|
10809 | 10806 | |
---|
10810 | 10807 | if (ocir->signature != TG3_OCIR_SIG_MAGIC || |
---|
10811 | 10808 | !(ocir->version_flags & TG3_OCIR_FLAG_ACTIVE)) |
---|
10812 | | - memset(ocir, 0, TG3_OCIR_LEN); |
---|
| 10809 | + memset(ocir, 0, len); |
---|
10813 | 10810 | } |
---|
10814 | 10811 | } |
---|
10815 | 10812 | |
---|
.. | .. |
---|
11189 | 11186 | rtnl_lock(); |
---|
11190 | 11187 | tg3_full_lock(tp, 0); |
---|
11191 | 11188 | |
---|
11192 | | - if (!netif_running(tp->dev)) { |
---|
| 11189 | + if (tp->pcierr_recovery || !netif_running(tp->dev)) { |
---|
11193 | 11190 | tg3_flag_clear(tp, RESET_TASK_PENDING); |
---|
11194 | 11191 | tg3_full_unlock(tp); |
---|
11195 | 11192 | rtnl_unlock(); |
---|
.. | .. |
---|
12322 | 12319 | struct tg3 *tp = netdev_priv(dev); |
---|
12323 | 12320 | |
---|
12324 | 12321 | strlcpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver)); |
---|
12325 | | - strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version)); |
---|
12326 | 12322 | strlcpy(info->fw_version, tp->fw_ver, sizeof(info->fw_version)); |
---|
12327 | 12323 | strlcpy(info->bus_info, pci_name(tp->pdev), sizeof(info->bus_info)); |
---|
12328 | 12324 | } |
---|
.. | .. |
---|
12513 | 12509 | tg3_warn_mgmt_link_flap(tp); |
---|
12514 | 12510 | |
---|
12515 | 12511 | if (tg3_flag(tp, USE_PHYLIB)) { |
---|
12516 | | - u32 newadv; |
---|
12517 | 12512 | struct phy_device *phydev; |
---|
12518 | 12513 | |
---|
12519 | 12514 | phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); |
---|
12520 | 12515 | |
---|
12521 | | - if (!(phydev->supported & SUPPORTED_Pause) || |
---|
12522 | | - (!(phydev->supported & SUPPORTED_Asym_Pause) && |
---|
12523 | | - (epause->rx_pause != epause->tx_pause))) |
---|
| 12516 | + if (!phy_validate_pause(phydev, epause)) |
---|
12524 | 12517 | return -EINVAL; |
---|
12525 | 12518 | |
---|
12526 | 12519 | tp->link_config.flowctrl = 0; |
---|
| 12520 | + phy_set_asym_pause(phydev, epause->rx_pause, epause->tx_pause); |
---|
12527 | 12521 | if (epause->rx_pause) { |
---|
12528 | 12522 | tp->link_config.flowctrl |= FLOW_CTRL_RX; |
---|
12529 | 12523 | |
---|
12530 | 12524 | if (epause->tx_pause) { |
---|
12531 | 12525 | tp->link_config.flowctrl |= FLOW_CTRL_TX; |
---|
12532 | | - newadv = ADVERTISED_Pause; |
---|
12533 | | - } else |
---|
12534 | | - newadv = ADVERTISED_Pause | |
---|
12535 | | - ADVERTISED_Asym_Pause; |
---|
| 12526 | + } |
---|
12536 | 12527 | } else if (epause->tx_pause) { |
---|
12537 | 12528 | tp->link_config.flowctrl |= FLOW_CTRL_TX; |
---|
12538 | | - newadv = ADVERTISED_Asym_Pause; |
---|
12539 | | - } else |
---|
12540 | | - newadv = 0; |
---|
| 12529 | + } |
---|
12541 | 12530 | |
---|
12542 | 12531 | if (epause->autoneg) |
---|
12543 | 12532 | tg3_flag_set(tp, PAUSE_AUTONEG); |
---|
.. | .. |
---|
12545 | 12534 | tg3_flag_clear(tp, PAUSE_AUTONEG); |
---|
12546 | 12535 | |
---|
12547 | 12536 | if (tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) { |
---|
12548 | | - u32 oldadv = phydev->advertising & |
---|
12549 | | - (ADVERTISED_Pause | ADVERTISED_Asym_Pause); |
---|
12550 | | - if (oldadv != newadv) { |
---|
12551 | | - phydev->advertising &= |
---|
12552 | | - ~(ADVERTISED_Pause | |
---|
12553 | | - ADVERTISED_Asym_Pause); |
---|
12554 | | - phydev->advertising |= newadv; |
---|
12555 | | - if (phydev->autoneg) { |
---|
12556 | | - /* |
---|
12557 | | - * Always renegotiate the link to |
---|
12558 | | - * inform our link partner of our |
---|
12559 | | - * flow control settings, even if the |
---|
12560 | | - * flow control is forced. Let |
---|
12561 | | - * tg3_adjust_link() do the final |
---|
12562 | | - * flow control setup. |
---|
12563 | | - */ |
---|
12564 | | - return phy_start_aneg(phydev); |
---|
12565 | | - } |
---|
| 12537 | + if (phydev->autoneg) { |
---|
| 12538 | + /* phy_set_asym_pause() will |
---|
| 12539 | + * renegotiate the link to inform our |
---|
| 12540 | + * link partner of our flow control |
---|
| 12541 | + * settings, even if the flow control |
---|
| 12542 | + * is forced. Let tg3_adjust_link() |
---|
| 12543 | + * do the final flow control setup. |
---|
| 12544 | + */ |
---|
| 12545 | + return 0; |
---|
12566 | 12546 | } |
---|
12567 | 12547 | |
---|
12568 | 12548 | if (!epause->autoneg) |
---|
12569 | 12549 | tg3_setup_flow_control(tp, 0, 0); |
---|
12570 | | - } else { |
---|
12571 | | - tp->link_config.advertising &= |
---|
12572 | | - ~(ADVERTISED_Pause | |
---|
12573 | | - ADVERTISED_Asym_Pause); |
---|
12574 | | - tp->link_config.advertising |= newadv; |
---|
12575 | 12550 | } |
---|
12576 | 12551 | } else { |
---|
12577 | 12552 | int irq_sync = 0; |
---|
.. | .. |
---|
12784 | 12759 | enum ethtool_phys_id_state state) |
---|
12785 | 12760 | { |
---|
12786 | 12761 | struct tg3 *tp = netdev_priv(dev); |
---|
12787 | | - |
---|
12788 | | - if (!netif_running(tp->dev)) |
---|
12789 | | - return -EAGAIN; |
---|
12790 | 12762 | |
---|
12791 | 12763 | switch (state) { |
---|
12792 | 12764 | case ETHTOOL_ID_ACTIVE: |
---|
.. | .. |
---|
14036 | 14008 | case SIOCGMIIPHY: |
---|
14037 | 14009 | data->phy_id = tp->phy_addr; |
---|
14038 | 14010 | |
---|
14039 | | - /* fallthru */ |
---|
| 14011 | + fallthrough; |
---|
14040 | 14012 | case SIOCGMIIREG: { |
---|
14041 | 14013 | u32 mii_regval; |
---|
14042 | 14014 | |
---|
.. | .. |
---|
14189 | 14161 | } |
---|
14190 | 14162 | |
---|
14191 | 14163 | static const struct ethtool_ops tg3_ethtool_ops = { |
---|
| 14164 | + .supported_coalesce_params = ETHTOOL_COALESCE_USECS | |
---|
| 14165 | + ETHTOOL_COALESCE_MAX_FRAMES | |
---|
| 14166 | + ETHTOOL_COALESCE_USECS_IRQ | |
---|
| 14167 | + ETHTOOL_COALESCE_MAX_FRAMES_IRQ | |
---|
| 14168 | + ETHTOOL_COALESCE_STATS_BLOCK_USECS, |
---|
14192 | 14169 | .get_drvinfo = tg3_get_drvinfo, |
---|
14193 | 14170 | .get_regs_len = tg3_get_regs_len, |
---|
14194 | 14171 | .get_regs = tg3_get_regs, |
---|
.. | .. |
---|
17007 | 16984 | return err; |
---|
17008 | 16985 | } |
---|
17009 | 16986 | |
---|
17010 | | -#ifdef CONFIG_SPARC |
---|
17011 | | -static int tg3_get_macaddr_sparc(struct tg3 *tp) |
---|
17012 | | -{ |
---|
17013 | | - struct net_device *dev = tp->dev; |
---|
17014 | | - struct pci_dev *pdev = tp->pdev; |
---|
17015 | | - struct device_node *dp = pci_device_to_OF_node(pdev); |
---|
17016 | | - const unsigned char *addr; |
---|
17017 | | - int len; |
---|
17018 | | - |
---|
17019 | | - addr = of_get_property(dp, "local-mac-address", &len); |
---|
17020 | | - if (addr && len == ETH_ALEN) { |
---|
17021 | | - memcpy(dev->dev_addr, addr, ETH_ALEN); |
---|
17022 | | - return 0; |
---|
17023 | | - } |
---|
17024 | | - return -ENODEV; |
---|
17025 | | -} |
---|
17026 | | - |
---|
17027 | | -static int tg3_get_default_macaddr_sparc(struct tg3 *tp) |
---|
17028 | | -{ |
---|
17029 | | - struct net_device *dev = tp->dev; |
---|
17030 | | - |
---|
17031 | | - memcpy(dev->dev_addr, idprom->id_ethaddr, ETH_ALEN); |
---|
17032 | | - return 0; |
---|
17033 | | -} |
---|
17034 | | -#endif |
---|
17035 | | - |
---|
17036 | 16987 | static int tg3_get_device_address(struct tg3 *tp) |
---|
17037 | 16988 | { |
---|
17038 | 16989 | struct net_device *dev = tp->dev; |
---|
.. | .. |
---|
17040 | 16991 | int addr_ok = 0; |
---|
17041 | 16992 | int err; |
---|
17042 | 16993 | |
---|
17043 | | -#ifdef CONFIG_SPARC |
---|
17044 | | - if (!tg3_get_macaddr_sparc(tp)) |
---|
| 16994 | + if (!eth_platform_get_mac_address(&tp->pdev->dev, dev->dev_addr)) |
---|
17045 | 16995 | return 0; |
---|
17046 | | -#endif |
---|
17047 | 16996 | |
---|
17048 | 16997 | if (tg3_flag(tp, IS_SSB_CORE)) { |
---|
17049 | 16998 | err = ssb_gige_get_macaddr(tp->pdev, &dev->dev_addr[0]); |
---|
.. | .. |
---|
17105 | 17054 | } |
---|
17106 | 17055 | } |
---|
17107 | 17056 | |
---|
17108 | | - if (!is_valid_ether_addr(&dev->dev_addr[0])) { |
---|
17109 | | -#ifdef CONFIG_SPARC |
---|
17110 | | - if (!tg3_get_default_macaddr_sparc(tp)) |
---|
17111 | | - return 0; |
---|
17112 | | -#endif |
---|
| 17057 | + if (!is_valid_ether_addr(&dev->dev_addr[0])) |
---|
17113 | 17058 | return -EINVAL; |
---|
17114 | | - } |
---|
17115 | 17059 | return 0; |
---|
17116 | 17060 | } |
---|
17117 | 17061 | |
---|
.. | .. |
---|
17202 | 17146 | val |= DMA_RWCTRL_WRITE_BNDRY_64_PCIE; |
---|
17203 | 17147 | break; |
---|
17204 | 17148 | } |
---|
17205 | | - /* fallthrough */ |
---|
| 17149 | + fallthrough; |
---|
17206 | 17150 | case 128: |
---|
17207 | 17151 | default: |
---|
17208 | 17152 | val &= ~DMA_RWCTRL_WRITE_BNDRY_DISAB_PCIE; |
---|
.. | .. |
---|
17217 | 17161 | DMA_RWCTRL_WRITE_BNDRY_16); |
---|
17218 | 17162 | break; |
---|
17219 | 17163 | } |
---|
17220 | | - /* fallthrough */ |
---|
| 17164 | + fallthrough; |
---|
17221 | 17165 | case 32: |
---|
17222 | 17166 | if (goal == BOUNDARY_SINGLE_CACHELINE) { |
---|
17223 | 17167 | val |= (DMA_RWCTRL_READ_BNDRY_32 | |
---|
17224 | 17168 | DMA_RWCTRL_WRITE_BNDRY_32); |
---|
17225 | 17169 | break; |
---|
17226 | 17170 | } |
---|
17227 | | - /* fallthrough */ |
---|
| 17171 | + fallthrough; |
---|
17228 | 17172 | case 64: |
---|
17229 | 17173 | if (goal == BOUNDARY_SINGLE_CACHELINE) { |
---|
17230 | 17174 | val |= (DMA_RWCTRL_READ_BNDRY_64 | |
---|
17231 | 17175 | DMA_RWCTRL_WRITE_BNDRY_64); |
---|
17232 | 17176 | break; |
---|
17233 | 17177 | } |
---|
17234 | | - /* fallthrough */ |
---|
| 17178 | + fallthrough; |
---|
17235 | 17179 | case 128: |
---|
17236 | 17180 | if (goal == BOUNDARY_SINGLE_CACHELINE) { |
---|
17237 | 17181 | val |= (DMA_RWCTRL_READ_BNDRY_128 | |
---|
17238 | 17182 | DMA_RWCTRL_WRITE_BNDRY_128); |
---|
17239 | 17183 | break; |
---|
17240 | 17184 | } |
---|
17241 | | - /* fallthrough */ |
---|
| 17185 | + fallthrough; |
---|
17242 | 17186 | case 256: |
---|
17243 | 17187 | val |= (DMA_RWCTRL_READ_BNDRY_256 | |
---|
17244 | 17188 | DMA_RWCTRL_WRITE_BNDRY_256); |
---|
.. | .. |
---|
17687 | 17631 | u64 dma_mask, persist_dma_mask; |
---|
17688 | 17632 | netdev_features_t features = 0; |
---|
17689 | 17633 | |
---|
17690 | | - printk_once(KERN_INFO "%s\n", version); |
---|
17691 | | - |
---|
17692 | 17634 | err = pci_enable_device(pdev); |
---|
17693 | 17635 | if (err) { |
---|
17694 | 17636 | dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n"); |
---|
.. | .. |
---|
18105 | 18047 | #ifdef CONFIG_PM_SLEEP |
---|
18106 | 18048 | static int tg3_suspend(struct device *device) |
---|
18107 | 18049 | { |
---|
18108 | | - struct pci_dev *pdev = to_pci_dev(device); |
---|
18109 | | - struct net_device *dev = pci_get_drvdata(pdev); |
---|
| 18050 | + struct net_device *dev = dev_get_drvdata(device); |
---|
18110 | 18051 | struct tg3 *tp = netdev_priv(dev); |
---|
18111 | 18052 | int err = 0; |
---|
18112 | 18053 | |
---|
.. | .. |
---|
18162 | 18103 | |
---|
18163 | 18104 | static int tg3_resume(struct device *device) |
---|
18164 | 18105 | { |
---|
18165 | | - struct pci_dev *pdev = to_pci_dev(device); |
---|
18166 | | - struct net_device *dev = pci_get_drvdata(pdev); |
---|
| 18106 | + struct net_device *dev = dev_get_drvdata(device); |
---|
18167 | 18107 | struct tg3 *tp = netdev_priv(dev); |
---|
18168 | 18108 | int err = 0; |
---|
18169 | 18109 | |
---|
.. | .. |
---|
18207 | 18147 | struct net_device *dev = pci_get_drvdata(pdev); |
---|
18208 | 18148 | struct tg3 *tp = netdev_priv(dev); |
---|
18209 | 18149 | |
---|
| 18150 | + tg3_reset_task_cancel(tp); |
---|
| 18151 | + |
---|
18210 | 18152 | rtnl_lock(); |
---|
| 18153 | + |
---|
18211 | 18154 | netif_device_detach(dev); |
---|
18212 | 18155 | |
---|
18213 | 18156 | if (netif_running(dev)) |
---|
18214 | 18157 | dev_close(dev); |
---|
18215 | 18158 | |
---|
18216 | | - if (system_state == SYSTEM_POWER_OFF) |
---|
18217 | | - tg3_power_down(tp); |
---|
| 18159 | + tg3_power_down(tp); |
---|
18218 | 18160 | |
---|
18219 | 18161 | rtnl_unlock(); |
---|
| 18162 | + |
---|
| 18163 | + pci_disable_device(pdev); |
---|
18220 | 18164 | } |
---|
18221 | 18165 | |
---|
18222 | 18166 | /** |
---|
.. | .. |
---|
18236 | 18180 | |
---|
18237 | 18181 | netdev_info(netdev, "PCI I/O error detected\n"); |
---|
18238 | 18182 | |
---|
| 18183 | + /* Want to make sure that the reset task doesn't run */ |
---|
| 18184 | + tg3_reset_task_cancel(tp); |
---|
| 18185 | + |
---|
18239 | 18186 | rtnl_lock(); |
---|
18240 | 18187 | |
---|
18241 | 18188 | /* Could be second call or maybe we don't have netdev yet */ |
---|
.. | .. |
---|
18251 | 18198 | tg3_netif_stop(tp); |
---|
18252 | 18199 | |
---|
18253 | 18200 | tg3_timer_stop(tp); |
---|
18254 | | - |
---|
18255 | | - /* Want to make sure that the reset task doesn't run */ |
---|
18256 | | - tg3_reset_task_cancel(tp); |
---|
18257 | 18201 | |
---|
18258 | 18202 | netif_device_detach(netdev); |
---|
18259 | 18203 | |
---|