diff options
27 files changed, 212 insertions, 191 deletions
diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 8153a3e0a1a4..f9b74c0a8492 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c | |||
| @@ -1842,7 +1842,7 @@ vortex_timer(unsigned long data) | |||
| 1842 | ok = 1; | 1842 | ok = 1; |
| 1843 | } | 1843 | } |
| 1844 | 1844 | ||
| 1845 | if (!netif_carrier_ok(dev)) | 1845 | if (dev->flags & IFF_SLAVE || !netif_carrier_ok(dev)) |
| 1846 | next_tick = 5*HZ; | 1846 | next_tick = 5*HZ; |
| 1847 | 1847 | ||
| 1848 | if (vp->medialock) | 1848 | if (vp->medialock) |
diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c b/drivers/net/ethernet/broadcom/bcm63xx_enet.c index 986019b2c849..c7ca7ec065ee 100644 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c | |||
| @@ -797,7 +797,7 @@ static int bcm_enet_open(struct net_device *dev) | |||
| 797 | if (priv->has_phy) { | 797 | if (priv->has_phy) { |
| 798 | /* connect to PHY */ | 798 | /* connect to PHY */ |
| 799 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, | 799 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, |
| 800 | priv->mac_id ? "1" : "0", priv->phy_id); | 800 | priv->mii_bus->id, priv->phy_id); |
| 801 | 801 | ||
| 802 | phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0, | 802 | phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0, |
| 803 | PHY_INTERFACE_MODE_MII); | 803 | PHY_INTERFACE_MODE_MII); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 1e3f978ee6da..254521319150 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -117,10 +117,6 @@ static int dropless_fc; | |||
| 117 | module_param(dropless_fc, int, 0); | 117 | module_param(dropless_fc, int, 0); |
| 118 | MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring"); | 118 | MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring"); |
| 119 | 119 | ||
| 120 | static int poll; | ||
| 121 | module_param(poll, int, 0); | ||
| 122 | MODULE_PARM_DESC(poll, " Use polling (for debug)"); | ||
| 123 | |||
| 124 | static int mrrs = -1; | 120 | static int mrrs = -1; |
| 125 | module_param(mrrs, int, 0); | 121 | module_param(mrrs, int, 0); |
| 126 | MODULE_PARM_DESC(mrrs, " Force Max Read Req Size (0..3) (for debug)"); | 122 | MODULE_PARM_DESC(mrrs, " Force Max Read Req Size (0..3) (for debug)"); |
| @@ -4834,20 +4830,11 @@ void bnx2x_drv_pulse(struct bnx2x *bp) | |||
| 4834 | 4830 | ||
| 4835 | static void bnx2x_timer(unsigned long data) | 4831 | static void bnx2x_timer(unsigned long data) |
| 4836 | { | 4832 | { |
| 4837 | u8 cos; | ||
| 4838 | struct bnx2x *bp = (struct bnx2x *) data; | 4833 | struct bnx2x *bp = (struct bnx2x *) data; |
| 4839 | 4834 | ||
| 4840 | if (!netif_running(bp->dev)) | 4835 | if (!netif_running(bp->dev)) |
| 4841 | return; | 4836 | return; |
| 4842 | 4837 | ||
| 4843 | if (poll) { | ||
| 4844 | struct bnx2x_fastpath *fp = &bp->fp[0]; | ||
| 4845 | |||
| 4846 | for_each_cos_in_tx_queue(fp, cos) | ||
| 4847 | bnx2x_tx_int(bp, &fp->txdata[cos]); | ||
| 4848 | bnx2x_rx_int(fp, 1000); | ||
| 4849 | } | ||
| 4850 | |||
| 4851 | if (!BP_NOMCP(bp)) { | 4838 | if (!BP_NOMCP(bp)) { |
| 4852 | int mb_idx = BP_FW_MB_IDX(bp); | 4839 | int mb_idx = BP_FW_MB_IDX(bp); |
| 4853 | u32 drv_pulse; | 4840 | u32 drv_pulse; |
| @@ -10063,7 +10050,6 @@ static void __devinit bnx2x_set_modes_bitmap(struct bnx2x *bp) | |||
| 10063 | static int __devinit bnx2x_init_bp(struct bnx2x *bp) | 10050 | static int __devinit bnx2x_init_bp(struct bnx2x *bp) |
| 10064 | { | 10051 | { |
| 10065 | int func; | 10052 | int func; |
| 10066 | int timer_interval; | ||
| 10067 | int rc; | 10053 | int rc; |
| 10068 | 10054 | ||
| 10069 | mutex_init(&bp->port.phy_mutex); | 10055 | mutex_init(&bp->port.phy_mutex); |
| @@ -10139,8 +10125,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) | |||
| 10139 | bp->tx_ticks = (50 / BNX2X_BTR) * BNX2X_BTR; | 10125 | bp->tx_ticks = (50 / BNX2X_BTR) * BNX2X_BTR; |
| 10140 | bp->rx_ticks = (25 / BNX2X_BTR) * BNX2X_BTR; | 10126 | bp->rx_ticks = (25 / BNX2X_BTR) * BNX2X_BTR; |
| 10141 | 10127 | ||
| 10142 | timer_interval = (CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ); | 10128 | bp->current_interval = CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ; |
| 10143 | bp->current_interval = (poll ? poll : timer_interval); | ||
| 10144 | 10129 | ||
| 10145 | init_timer(&bp->timer); | 10130 | init_timer(&bp->timer); |
| 10146 | bp->timer.expires = jiffies + bp->current_interval; | 10131 | bp->timer.expires = jiffies + bp->current_interval; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c index bc0121ac291e..1adef266fcd5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c | |||
| @@ -1081,17 +1081,17 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp) | |||
| 1081 | estats->rx_stat_ifhcinbadoctets_lo); | 1081 | estats->rx_stat_ifhcinbadoctets_lo); |
| 1082 | 1082 | ||
| 1083 | ADD_64(fstats->total_bytes_received_hi, | 1083 | ADD_64(fstats->total_bytes_received_hi, |
| 1084 | tfunc->rcv_error_bytes.hi, | 1084 | le32_to_cpu(tfunc->rcv_error_bytes.hi), |
| 1085 | fstats->total_bytes_received_lo, | 1085 | fstats->total_bytes_received_lo, |
| 1086 | tfunc->rcv_error_bytes.lo); | 1086 | le32_to_cpu(tfunc->rcv_error_bytes.lo)); |
| 1087 | 1087 | ||
| 1088 | memcpy(estats, &(fstats->total_bytes_received_hi), | 1088 | memcpy(estats, &(fstats->total_bytes_received_hi), |
| 1089 | sizeof(struct host_func_stats) - 2*sizeof(u32)); | 1089 | sizeof(struct host_func_stats) - 2*sizeof(u32)); |
| 1090 | 1090 | ||
| 1091 | ADD_64(estats->error_bytes_received_hi, | 1091 | ADD_64(estats->error_bytes_received_hi, |
| 1092 | tfunc->rcv_error_bytes.hi, | 1092 | le32_to_cpu(tfunc->rcv_error_bytes.hi), |
| 1093 | estats->error_bytes_received_lo, | 1093 | estats->error_bytes_received_lo, |
| 1094 | tfunc->rcv_error_bytes.lo); | 1094 | le32_to_cpu(tfunc->rcv_error_bytes.lo)); |
| 1095 | 1095 | ||
| 1096 | ADD_64(estats->etherstatsoverrsizepkts_hi, | 1096 | ADD_64(estats->etherstatsoverrsizepkts_hi, |
| 1097 | estats->rx_stat_dot3statsframestoolong_hi, | 1097 | estats->rx_stat_dot3statsframestoolong_hi, |
diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c index 1c7aad8fa19c..e92ef1bd732a 100644 --- a/drivers/net/ethernet/freescale/fec.c +++ b/drivers/net/ethernet/freescale/fec.c | |||
| @@ -986,7 +986,7 @@ static int fec_enet_mii_probe(struct net_device *ndev) | |||
| 986 | printk(KERN_INFO | 986 | printk(KERN_INFO |
| 987 | "%s: no PHY, assuming direct connection to switch\n", | 987 | "%s: no PHY, assuming direct connection to switch\n", |
| 988 | ndev->name); | 988 | ndev->name); |
| 989 | strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); | 989 | strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); |
| 990 | phy_id = 0; | 990 | phy_id = 0; |
| 991 | } | 991 | } |
| 992 | 992 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 55d7bd4e210a..8fa41f3082cf 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
| @@ -815,8 +815,9 @@ int mlx4_init_eq_table(struct mlx4_dev *dev) | |||
| 815 | int err; | 815 | int err; |
| 816 | int i; | 816 | int i; |
| 817 | 817 | ||
| 818 | priv->eq_table.uar_map = kcalloc(sizeof *priv->eq_table.uar_map, | 818 | priv->eq_table.uar_map = kcalloc(mlx4_num_eq_uar(dev), |
| 819 | mlx4_num_eq_uar(dev), GFP_KERNEL); | 819 | sizeof *priv->eq_table.uar_map, |
| 820 | GFP_KERNEL); | ||
| 820 | if (!priv->eq_table.uar_map) { | 821 | if (!priv->eq_table.uar_map) { |
| 821 | err = -ENOMEM; | 822 | err = -ENOMEM; |
| 822 | goto err_out_free; | 823 | goto err_out_free; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index dcd819bfb2f0..bfdb7af19e49 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
| @@ -73,6 +73,7 @@ struct res_gid { | |||
| 73 | struct list_head list; | 73 | struct list_head list; |
| 74 | u8 gid[16]; | 74 | u8 gid[16]; |
| 75 | enum mlx4_protocol prot; | 75 | enum mlx4_protocol prot; |
| 76 | enum mlx4_steer_type steer; | ||
| 76 | }; | 77 | }; |
| 77 | 78 | ||
| 78 | enum res_qp_states { | 79 | enum res_qp_states { |
| @@ -374,6 +375,7 @@ static struct res_common *alloc_qp_tr(int id) | |||
| 374 | 375 | ||
| 375 | ret->com.res_id = id; | 376 | ret->com.res_id = id; |
| 376 | ret->com.state = RES_QP_RESERVED; | 377 | ret->com.state = RES_QP_RESERVED; |
| 378 | ret->local_qpn = id; | ||
| 377 | INIT_LIST_HEAD(&ret->mcg_list); | 379 | INIT_LIST_HEAD(&ret->mcg_list); |
| 378 | spin_lock_init(&ret->mcg_spl); | 380 | spin_lock_init(&ret->mcg_spl); |
| 379 | 381 | ||
| @@ -2479,7 +2481,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave, | |||
| 2479 | } | 2481 | } |
| 2480 | 2482 | ||
| 2481 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2483 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
| 2482 | u8 *gid, enum mlx4_protocol prot) | 2484 | u8 *gid, enum mlx4_protocol prot, |
| 2485 | enum mlx4_steer_type steer) | ||
| 2483 | { | 2486 | { |
| 2484 | struct res_gid *res; | 2487 | struct res_gid *res; |
| 2485 | int err; | 2488 | int err; |
| @@ -2495,6 +2498,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
| 2495 | } else { | 2498 | } else { |
| 2496 | memcpy(res->gid, gid, 16); | 2499 | memcpy(res->gid, gid, 16); |
| 2497 | res->prot = prot; | 2500 | res->prot = prot; |
| 2501 | res->steer = steer; | ||
| 2498 | list_add_tail(&res->list, &rqp->mcg_list); | 2502 | list_add_tail(&res->list, &rqp->mcg_list); |
| 2499 | err = 0; | 2503 | err = 0; |
| 2500 | } | 2504 | } |
| @@ -2504,14 +2508,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
| 2504 | } | 2508 | } |
| 2505 | 2509 | ||
| 2506 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2510 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
| 2507 | u8 *gid, enum mlx4_protocol prot) | 2511 | u8 *gid, enum mlx4_protocol prot, |
| 2512 | enum mlx4_steer_type steer) | ||
| 2508 | { | 2513 | { |
| 2509 | struct res_gid *res; | 2514 | struct res_gid *res; |
| 2510 | int err; | 2515 | int err; |
| 2511 | 2516 | ||
| 2512 | spin_lock_irq(&rqp->mcg_spl); | 2517 | spin_lock_irq(&rqp->mcg_spl); |
| 2513 | res = find_gid(dev, slave, rqp, gid); | 2518 | res = find_gid(dev, slave, rqp, gid); |
| 2514 | if (!res || res->prot != prot) | 2519 | if (!res || res->prot != prot || res->steer != steer) |
| 2515 | err = -EINVAL; | 2520 | err = -EINVAL; |
| 2516 | else { | 2521 | else { |
| 2517 | list_del(&res->list); | 2522 | list_del(&res->list); |
| @@ -2538,7 +2543,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2538 | int attach = vhcr->op_modifier; | 2543 | int attach = vhcr->op_modifier; |
| 2539 | int block_loopback = vhcr->in_modifier >> 31; | 2544 | int block_loopback = vhcr->in_modifier >> 31; |
| 2540 | u8 steer_type_mask = 2; | 2545 | u8 steer_type_mask = 2; |
| 2541 | enum mlx4_steer_type type = gid[7] & steer_type_mask; | 2546 | enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1; |
| 2542 | 2547 | ||
| 2543 | qpn = vhcr->in_modifier & 0xffffff; | 2548 | qpn = vhcr->in_modifier & 0xffffff; |
| 2544 | err = get_res(dev, slave, qpn, RES_QP, &rqp); | 2549 | err = get_res(dev, slave, qpn, RES_QP, &rqp); |
| @@ -2547,7 +2552,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2547 | 2552 | ||
| 2548 | qp.qpn = qpn; | 2553 | qp.qpn = qpn; |
| 2549 | if (attach) { | 2554 | if (attach) { |
| 2550 | err = add_mcg_res(dev, slave, rqp, gid, prot); | 2555 | err = add_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2551 | if (err) | 2556 | if (err) |
| 2552 | goto ex_put; | 2557 | goto ex_put; |
| 2553 | 2558 | ||
| @@ -2556,7 +2561,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2556 | if (err) | 2561 | if (err) |
| 2557 | goto ex_rem; | 2562 | goto ex_rem; |
| 2558 | } else { | 2563 | } else { |
| 2559 | err = rem_mcg_res(dev, slave, rqp, gid, prot); | 2564 | err = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2560 | if (err) | 2565 | if (err) |
| 2561 | goto ex_put; | 2566 | goto ex_put; |
| 2562 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); | 2567 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); |
| @@ -2567,7 +2572,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2567 | 2572 | ||
| 2568 | ex_rem: | 2573 | ex_rem: |
| 2569 | /* ignore error return below, already in error */ | 2574 | /* ignore error return below, already in error */ |
| 2570 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot); | 2575 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2571 | ex_put: | 2576 | ex_put: |
| 2572 | put_res(dev, slave, qpn, RES_QP); | 2577 | put_res(dev, slave, qpn, RES_QP); |
| 2573 | 2578 | ||
| @@ -2606,7 +2611,7 @@ static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp) | |||
| 2606 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { | 2611 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { |
| 2607 | qp.qpn = rqp->local_qpn; | 2612 | qp.qpn = rqp->local_qpn; |
| 2608 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, | 2613 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, |
| 2609 | MLX4_MC_STEER); | 2614 | rgid->steer); |
| 2610 | list_del(&rgid->list); | 2615 | list_del(&rgid->list); |
| 2611 | kfree(rgid); | 2616 | kfree(rgid); |
| 2612 | } | 2617 | } |
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c index 6b35e7da9a9c..0c3e4005224d 100644 --- a/drivers/net/ethernet/micrel/ks8851.c +++ b/drivers/net/ethernet/micrel/ks8851.c | |||
| @@ -583,7 +583,7 @@ static void ks8851_rx_pkts(struct ks8851_net *ks) | |||
| 583 | ks8851_dbg_dumpkkt(ks, rxpkt); | 583 | ks8851_dbg_dumpkkt(ks, rxpkt); |
| 584 | 584 | ||
| 585 | skb->protocol = eth_type_trans(skb, ks->netdev); | 585 | skb->protocol = eth_type_trans(skb, ks->netdev); |
| 586 | netif_rx(skb); | 586 | netif_rx_ni(skb); |
| 587 | 587 | ||
| 588 | ks->netdev->stats.rx_packets++; | 588 | ks->netdev->stats.rx_packets++; |
| 589 | ks->netdev->stats.rx_bytes += rxlen; | 589 | ks->netdev->stats.rx_bytes += rxlen; |
diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c index e58e78e5c930..231176fcd2ba 100644 --- a/drivers/net/ethernet/micrel/ks8851_mll.c +++ b/drivers/net/ethernet/micrel/ks8851_mll.c | |||
| @@ -394,7 +394,6 @@ union ks_tx_hdr { | |||
| 394 | * @msg_enable : The message flags controlling driver output (see ethtool). | 394 | * @msg_enable : The message flags controlling driver output (see ethtool). |
| 395 | * @frame_cnt : number of frames received. | 395 | * @frame_cnt : number of frames received. |
| 396 | * @bus_width : i/o bus width. | 396 | * @bus_width : i/o bus width. |
| 397 | * @irq : irq number assigned to this device. | ||
| 398 | * @rc_rxqcr : Cached copy of KS_RXQCR. | 397 | * @rc_rxqcr : Cached copy of KS_RXQCR. |
| 399 | * @rc_txcr : Cached copy of KS_TXCR. | 398 | * @rc_txcr : Cached copy of KS_TXCR. |
| 400 | * @rc_ier : Cached copy of KS_IER. | 399 | * @rc_ier : Cached copy of KS_IER. |
| @@ -441,7 +440,6 @@ struct ks_net { | |||
| 441 | u32 msg_enable; | 440 | u32 msg_enable; |
| 442 | u32 frame_cnt; | 441 | u32 frame_cnt; |
| 443 | int bus_width; | 442 | int bus_width; |
| 444 | int irq; | ||
| 445 | 443 | ||
| 446 | u16 rc_rxqcr; | 444 | u16 rc_rxqcr; |
| 447 | u16 rc_txcr; | 445 | u16 rc_txcr; |
| @@ -907,10 +905,10 @@ static int ks_net_open(struct net_device *netdev) | |||
| 907 | netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__); | 905 | netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__); |
| 908 | 906 | ||
| 909 | /* reset the HW */ | 907 | /* reset the HW */ |
| 910 | err = request_irq(ks->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, netdev); | 908 | err = request_irq(netdev->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, netdev); |
| 911 | 909 | ||
| 912 | if (err) { | 910 | if (err) { |
| 913 | pr_err("Failed to request IRQ: %d: %d\n", ks->irq, err); | 911 | pr_err("Failed to request IRQ: %d: %d\n", netdev->irq, err); |
| 914 | return err; | 912 | return err; |
| 915 | } | 913 | } |
| 916 | 914 | ||
| @@ -955,7 +953,7 @@ static int ks_net_stop(struct net_device *netdev) | |||
| 955 | 953 | ||
| 956 | /* set powermode to soft power down to save power */ | 954 | /* set powermode to soft power down to save power */ |
| 957 | ks_set_powermode(ks, PMECR_PM_SOFTDOWN); | 955 | ks_set_powermode(ks, PMECR_PM_SOFTDOWN); |
| 958 | free_irq(ks->irq, netdev); | 956 | free_irq(netdev->irq, netdev); |
| 959 | mutex_unlock(&ks->lock); | 957 | mutex_unlock(&ks->lock); |
| 960 | return 0; | 958 | return 0; |
| 961 | } | 959 | } |
| @@ -1545,10 +1543,10 @@ static int __devinit ks8851_probe(struct platform_device *pdev) | |||
| 1545 | if (!ks->hw_addr_cmd) | 1543 | if (!ks->hw_addr_cmd) |
| 1546 | goto err_ioremap1; | 1544 | goto err_ioremap1; |
| 1547 | 1545 | ||
| 1548 | ks->irq = platform_get_irq(pdev, 0); | 1546 | netdev->irq = platform_get_irq(pdev, 0); |
| 1549 | 1547 | ||
| 1550 | if (ks->irq < 0) { | 1548 | if (netdev->irq < 0) { |
| 1551 | err = ks->irq; | 1549 | err = netdev->irq; |
| 1552 | goto err_get_irq; | 1550 | goto err_get_irq; |
| 1553 | } | 1551 | } |
| 1554 | 1552 | ||
diff --git a/drivers/net/ethernet/octeon/octeon_mgmt.c b/drivers/net/ethernet/octeon/octeon_mgmt.c index 212f43b308a3..cd827ff4a021 100644 --- a/drivers/net/ethernet/octeon/octeon_mgmt.c +++ b/drivers/net/ethernet/octeon/octeon_mgmt.c | |||
| @@ -670,7 +670,7 @@ static void octeon_mgmt_adjust_link(struct net_device *netdev) | |||
| 670 | static int octeon_mgmt_init_phy(struct net_device *netdev) | 670 | static int octeon_mgmt_init_phy(struct net_device *netdev) |
| 671 | { | 671 | { |
| 672 | struct octeon_mgmt *p = netdev_priv(netdev); | 672 | struct octeon_mgmt *p = netdev_priv(netdev); |
| 673 | char phy_id[20]; | 673 | char phy_id[MII_BUS_ID_SIZE + 3]; |
| 674 | 674 | ||
| 675 | if (octeon_is_simulation()) { | 675 | if (octeon_is_simulation()) { |
| 676 | /* No PHYs in the simulator. */ | 676 | /* No PHYs in the simulator. */ |
| @@ -678,7 +678,7 @@ static int octeon_mgmt_init_phy(struct net_device *netdev) | |||
| 678 | return 0; | 678 | return 0; |
| 679 | } | 679 | } |
| 680 | 680 | ||
| 681 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, "0", p->port); | 681 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, "mdio-octeon-0", p->port); |
| 682 | 682 | ||
| 683 | p->phydev = phy_connect(netdev, phy_id, octeon_mgmt_adjust_link, 0, | 683 | p->phydev = phy_connect(netdev, phy_id, octeon_mgmt_adjust_link, 0, |
| 684 | PHY_INTERFACE_MODE_MII); | 684 | PHY_INTERFACE_MODE_MII); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h index d0b814ef0675..0319d640f728 100644 --- a/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/drivers/net/ethernet/stmicro/stmmac/common.h | |||
| @@ -67,6 +67,7 @@ struct stmmac_extra_stats { | |||
| 67 | unsigned long ipc_csum_error; | 67 | unsigned long ipc_csum_error; |
| 68 | unsigned long rx_collision; | 68 | unsigned long rx_collision; |
| 69 | unsigned long rx_crc; | 69 | unsigned long rx_crc; |
| 70 | unsigned long dribbling_bit; | ||
| 70 | unsigned long rx_length; | 71 | unsigned long rx_length; |
| 71 | unsigned long rx_mii; | 72 | unsigned long rx_mii; |
| 72 | unsigned long rx_multicast; | 73 | unsigned long rx_multicast; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c index d87976364ec5..ad1b627f8ec2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c +++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c | |||
| @@ -201,7 +201,7 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, | |||
| 201 | 201 | ||
| 202 | if (unlikely(p->des01.erx.dribbling)) { | 202 | if (unlikely(p->des01.erx.dribbling)) { |
| 203 | CHIP_DBG(KERN_ERR "GMAC RX: dribbling error\n"); | 203 | CHIP_DBG(KERN_ERR "GMAC RX: dribbling error\n"); |
| 204 | ret = discard_frame; | 204 | x->dribbling_bit++; |
| 205 | } | 205 | } |
| 206 | if (unlikely(p->des01.erx.sa_filter_fail)) { | 206 | if (unlikely(p->des01.erx.sa_filter_fail)) { |
| 207 | CHIP_DBG(KERN_ERR "GMAC RX : Source Address filter fail\n"); | 207 | CHIP_DBG(KERN_ERR "GMAC RX : Source Address filter fail\n"); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c index fda5d2b31d3a..25953bb45a73 100644 --- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c +++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c | |||
| @@ -104,7 +104,7 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, | |||
| 104 | ret = discard_frame; | 104 | ret = discard_frame; |
| 105 | } | 105 | } |
| 106 | if (unlikely(p->des01.rx.dribbling)) | 106 | if (unlikely(p->des01.rx.dribbling)) |
| 107 | ret = discard_frame; | 107 | x->dribbling_bit++; |
| 108 | 108 | ||
| 109 | if (unlikely(p->des01.rx.length_error)) { | 109 | if (unlikely(p->des01.rx.length_error)) { |
| 110 | x->rx_length++; | 110 | x->rx_length++; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 120740020e2c..b4b095fdcf29 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | *******************************************************************************/ | 21 | *******************************************************************************/ |
| 22 | 22 | ||
| 23 | #define STMMAC_RESOURCE_NAME "stmmaceth" | 23 | #define STMMAC_RESOURCE_NAME "stmmaceth" |
| 24 | #define DRV_MODULE_VERSION "Dec_2011" | 24 | #define DRV_MODULE_VERSION "Feb_2012" |
| 25 | #include <linux/stmmac.h> | 25 | #include <linux/stmmac.h> |
| 26 | #include <linux/phy.h> | 26 | #include <linux/phy.h> |
| 27 | #include "common.h" | 27 | #include "common.h" |
| @@ -97,4 +97,5 @@ int stmmac_resume(struct net_device *ndev); | |||
| 97 | int stmmac_suspend(struct net_device *ndev); | 97 | int stmmac_suspend(struct net_device *ndev); |
| 98 | int stmmac_dvr_remove(struct net_device *ndev); | 98 | int stmmac_dvr_remove(struct net_device *ndev); |
| 99 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, | 99 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, |
| 100 | struct plat_stmmacenet_data *plat_dat); | 100 | struct plat_stmmacenet_data *plat_dat, |
| 101 | void __iomem *addr); | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c index 9573303a706b..f98e1511660f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | |||
| @@ -47,23 +47,25 @@ struct stmmac_stats { | |||
| 47 | offsetof(struct stmmac_priv, xstats.m)} | 47 | offsetof(struct stmmac_priv, xstats.m)} |
| 48 | 48 | ||
| 49 | static const struct stmmac_stats stmmac_gstrings_stats[] = { | 49 | static const struct stmmac_stats stmmac_gstrings_stats[] = { |
| 50 | /* Transmit errors */ | ||
| 50 | STMMAC_STAT(tx_underflow), | 51 | STMMAC_STAT(tx_underflow), |
| 51 | STMMAC_STAT(tx_carrier), | 52 | STMMAC_STAT(tx_carrier), |
| 52 | STMMAC_STAT(tx_losscarrier), | 53 | STMMAC_STAT(tx_losscarrier), |
| 53 | STMMAC_STAT(vlan_tag), | 54 | STMMAC_STAT(vlan_tag), |
| 54 | STMMAC_STAT(tx_deferred), | 55 | STMMAC_STAT(tx_deferred), |
| 55 | STMMAC_STAT(tx_vlan), | 56 | STMMAC_STAT(tx_vlan), |
| 56 | STMMAC_STAT(rx_vlan), | ||
| 57 | STMMAC_STAT(tx_jabber), | 57 | STMMAC_STAT(tx_jabber), |
| 58 | STMMAC_STAT(tx_frame_flushed), | 58 | STMMAC_STAT(tx_frame_flushed), |
| 59 | STMMAC_STAT(tx_payload_error), | 59 | STMMAC_STAT(tx_payload_error), |
| 60 | STMMAC_STAT(tx_ip_header_error), | 60 | STMMAC_STAT(tx_ip_header_error), |
| 61 | /* Receive errors */ | ||
| 61 | STMMAC_STAT(rx_desc), | 62 | STMMAC_STAT(rx_desc), |
| 62 | STMMAC_STAT(sa_filter_fail), | 63 | STMMAC_STAT(sa_filter_fail), |
| 63 | STMMAC_STAT(overflow_error), | 64 | STMMAC_STAT(overflow_error), |
| 64 | STMMAC_STAT(ipc_csum_error), | 65 | STMMAC_STAT(ipc_csum_error), |
| 65 | STMMAC_STAT(rx_collision), | 66 | STMMAC_STAT(rx_collision), |
| 66 | STMMAC_STAT(rx_crc), | 67 | STMMAC_STAT(rx_crc), |
| 68 | STMMAC_STAT(dribbling_bit), | ||
| 67 | STMMAC_STAT(rx_length), | 69 | STMMAC_STAT(rx_length), |
| 68 | STMMAC_STAT(rx_mii), | 70 | STMMAC_STAT(rx_mii), |
| 69 | STMMAC_STAT(rx_multicast), | 71 | STMMAC_STAT(rx_multicast), |
| @@ -73,6 +75,8 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = { | |||
| 73 | STMMAC_STAT(sa_rx_filter_fail), | 75 | STMMAC_STAT(sa_rx_filter_fail), |
| 74 | STMMAC_STAT(rx_missed_cntr), | 76 | STMMAC_STAT(rx_missed_cntr), |
| 75 | STMMAC_STAT(rx_overflow_cntr), | 77 | STMMAC_STAT(rx_overflow_cntr), |
| 78 | STMMAC_STAT(rx_vlan), | ||
| 79 | /* Tx/Rx IRQ errors */ | ||
| 76 | STMMAC_STAT(tx_undeflow_irq), | 80 | STMMAC_STAT(tx_undeflow_irq), |
| 77 | STMMAC_STAT(tx_process_stopped_irq), | 81 | STMMAC_STAT(tx_process_stopped_irq), |
| 78 | STMMAC_STAT(tx_jabber_irq), | 82 | STMMAC_STAT(tx_jabber_irq), |
| @@ -82,6 +86,7 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = { | |||
| 82 | STMMAC_STAT(rx_watchdog_irq), | 86 | STMMAC_STAT(rx_watchdog_irq), |
| 83 | STMMAC_STAT(tx_early_irq), | 87 | STMMAC_STAT(tx_early_irq), |
| 84 | STMMAC_STAT(fatal_bus_error_irq), | 88 | STMMAC_STAT(fatal_bus_error_irq), |
| 89 | /* Extra info */ | ||
| 85 | STMMAC_STAT(threshold), | 90 | STMMAC_STAT(threshold), |
| 86 | STMMAC_STAT(tx_pkt_n), | 91 | STMMAC_STAT(tx_pkt_n), |
| 87 | STMMAC_STAT(rx_pkt_n), | 92 | STMMAC_STAT(rx_pkt_n), |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 96fa2da30763..6ee593a55a64 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -241,7 +241,7 @@ static void stmmac_adjust_link(struct net_device *dev) | |||
| 241 | case 1000: | 241 | case 1000: |
| 242 | if (likely(priv->plat->has_gmac)) | 242 | if (likely(priv->plat->has_gmac)) |
| 243 | ctrl &= ~priv->hw->link.port; | 243 | ctrl &= ~priv->hw->link.port; |
| 244 | stmmac_hw_fix_mac_speed(priv); | 244 | stmmac_hw_fix_mac_speed(priv); |
| 245 | break; | 245 | break; |
| 246 | case 100: | 246 | case 100: |
| 247 | case 10: | 247 | case 10: |
| @@ -785,7 +785,7 @@ static u32 stmmac_get_synopsys_id(struct stmmac_priv *priv) | |||
| 785 | u32 uid = ((hwid & 0x0000ff00) >> 8); | 785 | u32 uid = ((hwid & 0x0000ff00) >> 8); |
| 786 | u32 synid = (hwid & 0x000000ff); | 786 | u32 synid = (hwid & 0x000000ff); |
| 787 | 787 | ||
| 788 | pr_info("STMMAC - user ID: 0x%x, Synopsys ID: 0x%x\n", | 788 | pr_info("stmmac - user ID: 0x%x, Synopsys ID: 0x%x\n", |
| 789 | uid, synid); | 789 | uid, synid); |
| 790 | 790 | ||
| 791 | return synid; | 791 | return synid; |
| @@ -869,38 +869,6 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv) | |||
| 869 | return hw_cap; | 869 | return hw_cap; |
| 870 | } | 870 | } |
| 871 | 871 | ||
| 872 | /** | ||
| 873 | * stmmac_mac_device_setup | ||
| 874 | * @dev : device pointer | ||
| 875 | * Description: this is to attach the GMAC or MAC 10/100 | ||
| 876 | * main core structures that will be completed during the | ||
| 877 | * open step. | ||
| 878 | */ | ||
| 879 | static int stmmac_mac_device_setup(struct net_device *dev) | ||
| 880 | { | ||
| 881 | struct stmmac_priv *priv = netdev_priv(dev); | ||
| 882 | |||
| 883 | struct mac_device_info *device; | ||
| 884 | |||
| 885 | if (priv->plat->has_gmac) | ||
| 886 | device = dwmac1000_setup(priv->ioaddr); | ||
| 887 | else | ||
| 888 | device = dwmac100_setup(priv->ioaddr); | ||
| 889 | |||
| 890 | if (!device) | ||
| 891 | return -ENOMEM; | ||
| 892 | |||
| 893 | priv->hw = device; | ||
| 894 | priv->hw->ring = &ring_mode_ops; | ||
| 895 | |||
| 896 | if (device_can_wakeup(priv->device)) { | ||
| 897 | priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */ | ||
| 898 | enable_irq_wake(priv->wol_irq); | ||
| 899 | } | ||
| 900 | |||
| 901 | return 0; | ||
| 902 | } | ||
| 903 | |||
| 904 | static void stmmac_check_ether_addr(struct stmmac_priv *priv) | 872 | static void stmmac_check_ether_addr(struct stmmac_priv *priv) |
| 905 | { | 873 | { |
| 906 | /* verify if the MAC address is valid, in case of failures it | 874 | /* verify if the MAC address is valid, in case of failures it |
| @@ -930,20 +898,8 @@ static int stmmac_open(struct net_device *dev) | |||
| 930 | struct stmmac_priv *priv = netdev_priv(dev); | 898 | struct stmmac_priv *priv = netdev_priv(dev); |
| 931 | int ret; | 899 | int ret; |
| 932 | 900 | ||
| 933 | /* MAC HW device setup */ | ||
| 934 | ret = stmmac_mac_device_setup(dev); | ||
| 935 | if (ret < 0) | ||
| 936 | return ret; | ||
| 937 | |||
| 938 | stmmac_check_ether_addr(priv); | 901 | stmmac_check_ether_addr(priv); |
| 939 | 902 | ||
| 940 | stmmac_verify_args(); | ||
| 941 | |||
| 942 | /* Override with kernel parameters if supplied XXX CRS XXX | ||
| 943 | * this needs to have multiple instances */ | ||
| 944 | if ((phyaddr >= 0) && (phyaddr <= 31)) | ||
| 945 | priv->plat->phy_addr = phyaddr; | ||
| 946 | |||
| 947 | /* MDIO bus Registration */ | 903 | /* MDIO bus Registration */ |
| 948 | ret = stmmac_mdio_register(dev); | 904 | ret = stmmac_mdio_register(dev); |
| 949 | if (ret < 0) { | 905 | if (ret < 0) { |
| @@ -976,44 +932,6 @@ static int stmmac_open(struct net_device *dev) | |||
| 976 | goto open_error; | 932 | goto open_error; |
| 977 | } | 933 | } |
| 978 | 934 | ||
| 979 | stmmac_get_synopsys_id(priv); | ||
| 980 | |||
| 981 | priv->hw_cap_support = stmmac_get_hw_features(priv); | ||
| 982 | |||
| 983 | if (priv->hw_cap_support) { | ||
| 984 | pr_info(" Support DMA HW capability register"); | ||
| 985 | |||
| 986 | /* We can override some gmac/dma configuration fields: e.g. | ||
| 987 | * enh_desc, tx_coe (e.g. that are passed through the | ||
| 988 | * platform) with the values from the HW capability | ||
| 989 | * register (if supported). | ||
| 990 | */ | ||
| 991 | priv->plat->enh_desc = priv->dma_cap.enh_desc; | ||
| 992 | priv->plat->tx_coe = priv->dma_cap.tx_coe; | ||
| 993 | priv->plat->pmt = priv->dma_cap.pmt_remote_wake_up; | ||
| 994 | |||
| 995 | /* By default disable wol on magic frame if not supported */ | ||
| 996 | if (!priv->dma_cap.pmt_magic_frame) | ||
| 997 | priv->wolopts &= ~WAKE_MAGIC; | ||
| 998 | |||
| 999 | } else | ||
| 1000 | pr_info(" No HW DMA feature register supported"); | ||
| 1001 | |||
| 1002 | /* Select the enhnaced/normal descriptor structures */ | ||
| 1003 | stmmac_selec_desc_mode(priv); | ||
| 1004 | |||
| 1005 | /* PMT module is not integrated in all the MAC devices. */ | ||
| 1006 | if (priv->plat->pmt) { | ||
| 1007 | pr_info(" Remote wake-up capable\n"); | ||
| 1008 | device_set_wakeup_capable(priv->device, 1); | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | priv->rx_coe = priv->hw->mac->rx_coe(priv->ioaddr); | ||
| 1012 | if (priv->rx_coe) | ||
| 1013 | pr_info(" Checksum Offload Engine supported\n"); | ||
| 1014 | if (priv->plat->tx_coe) | ||
| 1015 | pr_info(" Checksum insertion supported\n"); | ||
| 1016 | |||
| 1017 | /* Create and initialize the TX/RX descriptors chains. */ | 935 | /* Create and initialize the TX/RX descriptors chains. */ |
| 1018 | priv->dma_tx_size = STMMAC_ALIGN(dma_txsize); | 936 | priv->dma_tx_size = STMMAC_ALIGN(dma_txsize); |
| 1019 | priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); | 937 | priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); |
| @@ -1030,14 +948,14 @@ static int stmmac_open(struct net_device *dev) | |||
| 1030 | 948 | ||
| 1031 | /* Copy the MAC addr into the HW */ | 949 | /* Copy the MAC addr into the HW */ |
| 1032 | priv->hw->mac->set_umac_addr(priv->ioaddr, dev->dev_addr, 0); | 950 | priv->hw->mac->set_umac_addr(priv->ioaddr, dev->dev_addr, 0); |
| 951 | |||
| 1033 | /* If required, perform hw setup of the bus. */ | 952 | /* If required, perform hw setup of the bus. */ |
| 1034 | if (priv->plat->bus_setup) | 953 | if (priv->plat->bus_setup) |
| 1035 | priv->plat->bus_setup(priv->ioaddr); | 954 | priv->plat->bus_setup(priv->ioaddr); |
| 955 | |||
| 1036 | /* Initialize the MAC Core */ | 956 | /* Initialize the MAC Core */ |
| 1037 | priv->hw->mac->core_init(priv->ioaddr); | 957 | priv->hw->mac->core_init(priv->ioaddr); |
| 1038 | 958 | ||
| 1039 | netdev_update_features(dev); | ||
| 1040 | |||
| 1041 | /* Request the IRQ lines */ | 959 | /* Request the IRQ lines */ |
| 1042 | ret = request_irq(dev->irq, stmmac_interrupt, | 960 | ret = request_irq(dev->irq, stmmac_interrupt, |
| 1043 | IRQF_SHARED, dev->name, dev); | 961 | IRQF_SHARED, dev->name, dev); |
| @@ -1047,6 +965,17 @@ static int stmmac_open(struct net_device *dev) | |||
| 1047 | goto open_error; | 965 | goto open_error; |
| 1048 | } | 966 | } |
| 1049 | 967 | ||
| 968 | /* Request the Wake IRQ in case of another line is used for WoL */ | ||
| 969 | if (priv->wol_irq != dev->irq) { | ||
| 970 | ret = request_irq(priv->wol_irq, stmmac_interrupt, | ||
| 971 | IRQF_SHARED, dev->name, dev); | ||
| 972 | if (unlikely(ret < 0)) { | ||
| 973 | pr_err("%s: ERROR: allocating the ext WoL IRQ %d " | ||
| 974 | "(error: %d)\n", __func__, priv->wol_irq, ret); | ||
| 975 | goto open_error_wolirq; | ||
| 976 | } | ||
| 977 | } | ||
| 978 | |||
| 1050 | /* Enable the MAC Rx/Tx */ | 979 | /* Enable the MAC Rx/Tx */ |
| 1051 | stmmac_set_mac(priv->ioaddr, true); | 980 | stmmac_set_mac(priv->ioaddr, true); |
| 1052 | 981 | ||
| @@ -1062,7 +991,7 @@ static int stmmac_open(struct net_device *dev) | |||
| 1062 | #ifdef CONFIG_STMMAC_DEBUG_FS | 991 | #ifdef CONFIG_STMMAC_DEBUG_FS |
| 1063 | ret = stmmac_init_fs(dev); | 992 | ret = stmmac_init_fs(dev); |
| 1064 | if (ret < 0) | 993 | if (ret < 0) |
| 1065 | pr_warning("\tFailed debugFS registration"); | 994 | pr_warning("%s: failed debugFS registration\n", __func__); |
| 1066 | #endif | 995 | #endif |
| 1067 | /* Start the ball rolling... */ | 996 | /* Start the ball rolling... */ |
| 1068 | DBG(probe, DEBUG, "%s: DMA RX/TX processes started...\n", dev->name); | 997 | DBG(probe, DEBUG, "%s: DMA RX/TX processes started...\n", dev->name); |
| @@ -1072,6 +1001,7 @@ static int stmmac_open(struct net_device *dev) | |||
| 1072 | #ifdef CONFIG_STMMAC_TIMER | 1001 | #ifdef CONFIG_STMMAC_TIMER |
| 1073 | priv->tm->timer_start(tmrate); | 1002 | priv->tm->timer_start(tmrate); |
| 1074 | #endif | 1003 | #endif |
| 1004 | |||
| 1075 | /* Dump DMA/MAC registers */ | 1005 | /* Dump DMA/MAC registers */ |
| 1076 | if (netif_msg_hw(priv)) { | 1006 | if (netif_msg_hw(priv)) { |
| 1077 | priv->hw->mac->dump_regs(priv->ioaddr); | 1007 | priv->hw->mac->dump_regs(priv->ioaddr); |
| @@ -1087,6 +1017,9 @@ static int stmmac_open(struct net_device *dev) | |||
| 1087 | 1017 | ||
| 1088 | return 0; | 1018 | return 0; |
| 1089 | 1019 | ||
| 1020 | open_error_wolirq: | ||
| 1021 | free_irq(dev->irq, dev); | ||
| 1022 | |||
| 1090 | open_error: | 1023 | open_error: |
| 1091 | #ifdef CONFIG_STMMAC_TIMER | 1024 | #ifdef CONFIG_STMMAC_TIMER |
| 1092 | kfree(priv->tm); | 1025 | kfree(priv->tm); |
| @@ -1127,6 +1060,8 @@ static int stmmac_release(struct net_device *dev) | |||
| 1127 | 1060 | ||
| 1128 | /* Free the IRQ lines */ | 1061 | /* Free the IRQ lines */ |
| 1129 | free_irq(dev->irq, dev); | 1062 | free_irq(dev->irq, dev); |
| 1063 | if (priv->wol_irq != dev->irq) | ||
| 1064 | free_irq(priv->wol_irq, dev); | ||
| 1130 | 1065 | ||
| 1131 | /* Stop TX/RX DMA and clear the descriptors */ | 1066 | /* Stop TX/RX DMA and clear the descriptors */ |
| 1132 | priv->hw->dma->stop_tx(priv->ioaddr); | 1067 | priv->hw->dma->stop_tx(priv->ioaddr); |
| @@ -1789,13 +1724,77 @@ static const struct net_device_ops stmmac_netdev_ops = { | |||
| 1789 | }; | 1724 | }; |
| 1790 | 1725 | ||
| 1791 | /** | 1726 | /** |
| 1727 | * stmmac_hw_init - Init the MAC device | ||
| 1728 | * @priv : pointer to the private device structure. | ||
| 1729 | * Description: this function detects which MAC device | ||
| 1730 | * (GMAC/MAC10-100) has to attached, checks the HW capability | ||
| 1731 | * (if supported) and sets the driver's features (for example | ||
| 1732 | * to use the ring or chaine mode or support the normal/enh | ||
| 1733 | * descriptor structure). | ||
| 1734 | */ | ||
| 1735 | static int stmmac_hw_init(struct stmmac_priv *priv) | ||
| 1736 | { | ||
| 1737 | int ret = 0; | ||
| 1738 | struct mac_device_info *mac; | ||
| 1739 | |||
| 1740 | /* Identify the MAC HW device */ | ||
| 1741 | if (priv->plat->has_gmac) | ||
| 1742 | mac = dwmac1000_setup(priv->ioaddr); | ||
| 1743 | else | ||
| 1744 | mac = dwmac100_setup(priv->ioaddr); | ||
| 1745 | if (!mac) | ||
| 1746 | return -ENOMEM; | ||
| 1747 | |||
| 1748 | priv->hw = mac; | ||
| 1749 | |||
| 1750 | /* To use the chained or ring mode */ | ||
| 1751 | priv->hw->ring = &ring_mode_ops; | ||
| 1752 | |||
| 1753 | /* Get and dump the chip ID */ | ||
| 1754 | stmmac_get_synopsys_id(priv); | ||
| 1755 | |||
| 1756 | /* Get the HW capability (new GMAC newer than 3.50a) */ | ||
| 1757 | priv->hw_cap_support = stmmac_get_hw_features(priv); | ||
| 1758 | if (priv->hw_cap_support) { | ||
| 1759 | pr_info(" DMA HW capability register supported"); | ||
| 1760 | |||
| 1761 | /* We can override some gmac/dma configuration fields: e.g. | ||
| 1762 | * enh_desc, tx_coe (e.g. that are passed through the | ||
| 1763 | * platform) with the values from the HW capability | ||
| 1764 | * register (if supported). | ||
| 1765 | */ | ||
| 1766 | priv->plat->enh_desc = priv->dma_cap.enh_desc; | ||
| 1767 | priv->plat->tx_coe = priv->dma_cap.tx_coe; | ||
| 1768 | priv->plat->pmt = priv->dma_cap.pmt_remote_wake_up; | ||
| 1769 | } else | ||
| 1770 | pr_info(" No HW DMA feature register supported"); | ||
| 1771 | |||
| 1772 | /* Select the enhnaced/normal descriptor structures */ | ||
| 1773 | stmmac_selec_desc_mode(priv); | ||
| 1774 | |||
| 1775 | priv->rx_coe = priv->hw->mac->rx_coe(priv->ioaddr); | ||
| 1776 | if (priv->rx_coe) | ||
| 1777 | pr_info(" RX Checksum Offload Engine supported\n"); | ||
| 1778 | if (priv->plat->tx_coe) | ||
| 1779 | pr_info(" TX Checksum insertion supported\n"); | ||
| 1780 | |||
| 1781 | if (priv->plat->pmt) { | ||
| 1782 | pr_info(" Wake-Up On Lan supported\n"); | ||
| 1783 | device_set_wakeup_capable(priv->device, 1); | ||
| 1784 | } | ||
| 1785 | |||
| 1786 | return ret; | ||
| 1787 | } | ||
| 1788 | |||
| 1789 | /** | ||
| 1792 | * stmmac_dvr_probe | 1790 | * stmmac_dvr_probe |
| 1793 | * @device: device pointer | 1791 | * @device: device pointer |
| 1794 | * Description: this is the main probe function used to | 1792 | * Description: this is the main probe function used to |
| 1795 | * call the alloc_etherdev, allocate the priv structure. | 1793 | * call the alloc_etherdev, allocate the priv structure. |
| 1796 | */ | 1794 | */ |
| 1797 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, | 1795 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, |
| 1798 | struct plat_stmmacenet_data *plat_dat) | 1796 | struct plat_stmmacenet_data *plat_dat, |
| 1797 | void __iomem *addr) | ||
| 1799 | { | 1798 | { |
| 1800 | int ret = 0; | 1799 | int ret = 0; |
| 1801 | struct net_device *ndev = NULL; | 1800 | struct net_device *ndev = NULL; |
| @@ -1815,10 +1814,27 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
| 1815 | 1814 | ||
| 1816 | ether_setup(ndev); | 1815 | ether_setup(ndev); |
| 1817 | 1816 | ||
| 1818 | ndev->netdev_ops = &stmmac_netdev_ops; | ||
| 1819 | stmmac_set_ethtool_ops(ndev); | 1817 | stmmac_set_ethtool_ops(ndev); |
| 1818 | priv->pause = pause; | ||
| 1819 | priv->plat = plat_dat; | ||
| 1820 | priv->ioaddr = addr; | ||
| 1821 | priv->dev->base_addr = (unsigned long)addr; | ||
| 1822 | |||
| 1823 | /* Verify driver arguments */ | ||
| 1824 | stmmac_verify_args(); | ||
| 1825 | |||
| 1826 | /* Override with kernel parameters if supplied XXX CRS XXX | ||
| 1827 | * this needs to have multiple instances */ | ||
| 1828 | if ((phyaddr >= 0) && (phyaddr <= 31)) | ||
| 1829 | priv->plat->phy_addr = phyaddr; | ||
| 1830 | |||
| 1831 | /* Init MAC and get the capabilities */ | ||
| 1832 | stmmac_hw_init(priv); | ||
| 1833 | |||
| 1834 | ndev->netdev_ops = &stmmac_netdev_ops; | ||
| 1820 | 1835 | ||
| 1821 | ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; | 1836 | ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
| 1837 | NETIF_F_RXCSUM; | ||
| 1822 | ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA; | 1838 | ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA; |
| 1823 | ndev->watchdog_timeo = msecs_to_jiffies(watchdog); | 1839 | ndev->watchdog_timeo = msecs_to_jiffies(watchdog); |
| 1824 | #ifdef STMMAC_VLAN_TAG_USED | 1840 | #ifdef STMMAC_VLAN_TAG_USED |
| @@ -1830,8 +1846,6 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
| 1830 | if (flow_ctrl) | 1846 | if (flow_ctrl) |
| 1831 | priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */ | 1847 | priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */ |
| 1832 | 1848 | ||
| 1833 | priv->pause = pause; | ||
| 1834 | priv->plat = plat_dat; | ||
| 1835 | netif_napi_add(ndev, &priv->napi, stmmac_poll, 64); | 1849 | netif_napi_add(ndev, &priv->napi, stmmac_poll, 64); |
| 1836 | 1850 | ||
| 1837 | spin_lock_init(&priv->lock); | 1851 | spin_lock_init(&priv->lock); |
| @@ -1839,15 +1853,10 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
| 1839 | 1853 | ||
| 1840 | ret = register_netdev(ndev); | 1854 | ret = register_netdev(ndev); |
| 1841 | if (ret) { | 1855 | if (ret) { |
| 1842 | pr_err("%s: ERROR %i registering the device\n", | 1856 | pr_err("%s: ERROR %i registering the device\n", __func__, ret); |
| 1843 | __func__, ret); | ||
| 1844 | goto error; | 1857 | goto error; |
| 1845 | } | 1858 | } |
| 1846 | 1859 | ||
| 1847 | DBG(probe, DEBUG, "%s: Scatter/Gather: %s - HW checksums: %s\n", | ||
| 1848 | ndev->name, (ndev->features & NETIF_F_SG) ? "on" : "off", | ||
| 1849 | (ndev->features & NETIF_F_IP_CSUM) ? "on" : "off"); | ||
| 1850 | |||
| 1851 | return priv; | 1860 | return priv; |
| 1852 | 1861 | ||
| 1853 | error: | 1862 | error: |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index c796de9eed72..50ad5b80cfaf 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | |||
| @@ -96,13 +96,11 @@ static int __devinit stmmac_pci_probe(struct pci_dev *pdev, | |||
| 96 | 96 | ||
| 97 | stmmac_default_data(); | 97 | stmmac_default_data(); |
| 98 | 98 | ||
| 99 | priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat); | 99 | priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat, addr); |
| 100 | if (!priv) { | 100 | if (!priv) { |
| 101 | pr_err("%s: main drivr probe failed", __func__); | 101 | pr_err("%s: main driver probe failed", __func__); |
| 102 | goto err_out; | 102 | goto err_out; |
| 103 | } | 103 | } |
| 104 | priv->ioaddr = addr; | ||
| 105 | priv->dev->base_addr = (unsigned long)addr; | ||
| 106 | priv->dev->irq = pdev->irq; | 104 | priv->dev->irq = pdev->irq; |
| 107 | priv->wol_irq = pdev->irq; | 105 | priv->wol_irq = pdev->irq; |
| 108 | 106 | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 1ac83243649a..3aad9810237c 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | |||
| @@ -59,16 +59,20 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) | |||
| 59 | goto out_release_region; | 59 | goto out_release_region; |
| 60 | } | 60 | } |
| 61 | plat_dat = pdev->dev.platform_data; | 61 | plat_dat = pdev->dev.platform_data; |
| 62 | priv = stmmac_dvr_probe(&(pdev->dev), plat_dat); | 62 | |
| 63 | /* Custom initialisation (if needed)*/ | ||
| 64 | if (plat_dat->init) { | ||
| 65 | ret = plat_dat->init(pdev); | ||
| 66 | if (unlikely(ret)) | ||
| 67 | goto out_unmap; | ||
| 68 | } | ||
| 69 | |||
| 70 | priv = stmmac_dvr_probe(&(pdev->dev), plat_dat, addr); | ||
| 63 | if (!priv) { | 71 | if (!priv) { |
| 64 | pr_err("%s: main drivr probe failed", __func__); | 72 | pr_err("%s: main driver probe failed", __func__); |
| 65 | goto out_unmap; | 73 | goto out_unmap; |
| 66 | } | 74 | } |
| 67 | 75 | ||
| 68 | priv->ioaddr = addr; | ||
| 69 | /* Set the I/O base addr */ | ||
| 70 | priv->dev->base_addr = (unsigned long)addr; | ||
| 71 | |||
| 72 | /* Get the MAC information */ | 76 | /* Get the MAC information */ |
| 73 | priv->dev->irq = platform_get_irq_byname(pdev, "macirq"); | 77 | priv->dev->irq = platform_get_irq_byname(pdev, "macirq"); |
| 74 | if (priv->dev->irq == -ENXIO) { | 78 | if (priv->dev->irq == -ENXIO) { |
| @@ -92,13 +96,6 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) | |||
| 92 | 96 | ||
| 93 | platform_set_drvdata(pdev, priv->dev); | 97 | platform_set_drvdata(pdev, priv->dev); |
| 94 | 98 | ||
| 95 | /* Custom initialisation */ | ||
| 96 | if (priv->plat->init) { | ||
| 97 | ret = priv->plat->init(pdev); | ||
| 98 | if (unlikely(ret)) | ||
| 99 | goto out_unmap; | ||
| 100 | } | ||
| 101 | |||
| 102 | pr_debug("STMMAC platform driver registration completed"); | 99 | pr_debug("STMMAC platform driver registration completed"); |
| 103 | 100 | ||
| 104 | return 0; | 101 | return 0; |
diff --git a/drivers/net/ethernet/ti/cpmac.c b/drivers/net/ethernet/ti/cpmac.c index 4d9a28ffd3c3..cbc8df78d84b 100644 --- a/drivers/net/ethernet/ti/cpmac.c +++ b/drivers/net/ethernet/ti/cpmac.c | |||
| @@ -1122,7 +1122,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev) | |||
| 1122 | pdata = pdev->dev.platform_data; | 1122 | pdata = pdev->dev.platform_data; |
| 1123 | 1123 | ||
| 1124 | if (external_switch || dumb_switch) { | 1124 | if (external_switch || dumb_switch) { |
| 1125 | strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ | 1125 | strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */ |
| 1126 | phy_id = pdev->id; | 1126 | phy_id = pdev->id; |
| 1127 | } else { | 1127 | } else { |
| 1128 | for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { | 1128 | for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { |
| @@ -1138,7 +1138,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev) | |||
| 1138 | if (phy_id == PHY_MAX_ADDR) { | 1138 | if (phy_id == PHY_MAX_ADDR) { |
| 1139 | dev_err(&pdev->dev, "no PHY present, falling back " | 1139 | dev_err(&pdev->dev, "no PHY present, falling back " |
| 1140 | "to switch on MDIO bus 0\n"); | 1140 | "to switch on MDIO bus 0\n"); |
| 1141 | strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ | 1141 | strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */ |
| 1142 | phy_id = pdev->id; | 1142 | phy_id = pdev->id; |
| 1143 | } | 1143 | } |
| 1144 | 1144 | ||
diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 72a854f05bb8..41a8b5a9849e 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c | |||
| @@ -1416,7 +1416,8 @@ static int __devinit eth_init_one(struct platform_device *pdev) | |||
| 1416 | __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); | 1416 | __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); |
| 1417 | udelay(50); | 1417 | udelay(50); |
| 1418 | 1418 | ||
| 1419 | snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, "0", plat->phy); | 1419 | snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, |
| 1420 | mdio_bus->id, plat->phy); | ||
| 1420 | port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, | 1421 | port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, |
| 1421 | PHY_INTERFACE_MODE_MII); | 1422 | PHY_INTERFACE_MODE_MII); |
| 1422 | if (IS_ERR(port->phydev)) { | 1423 | if (IS_ERR(port->phydev)) { |
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index e84662db51cc..dd78c4cbd459 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c | |||
| @@ -60,6 +60,7 @@ | |||
| 60 | #define USB_PRODUCT_IPHONE_3GS 0x1294 | 60 | #define USB_PRODUCT_IPHONE_3GS 0x1294 |
| 61 | #define USB_PRODUCT_IPHONE_4 0x1297 | 61 | #define USB_PRODUCT_IPHONE_4 0x1297 |
| 62 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c | 62 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c |
| 63 | #define USB_PRODUCT_IPHONE_4S 0x12a0 | ||
| 63 | 64 | ||
| 64 | #define IPHETH_USBINTF_CLASS 255 | 65 | #define IPHETH_USBINTF_CLASS 255 |
| 65 | #define IPHETH_USBINTF_SUBCLASS 253 | 66 | #define IPHETH_USBINTF_SUBCLASS 253 |
| @@ -103,6 +104,10 @@ static struct usb_device_id ipheth_table[] = { | |||
| 103 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4_VZW, | 104 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4_VZW, |
| 104 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, | 105 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, |
| 105 | IPHETH_USBINTF_PROTO) }, | 106 | IPHETH_USBINTF_PROTO) }, |
| 107 | { USB_DEVICE_AND_INTERFACE_INFO( | ||
| 108 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S, | ||
| 109 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, | ||
| 110 | IPHETH_USBINTF_PROTO) }, | ||
| 106 | { } | 111 | { } |
| 107 | }; | 112 | }; |
| 108 | MODULE_DEVICE_TABLE(usb, ipheth_table); | 113 | MODULE_DEVICE_TABLE(usb, ipheth_table); |
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 49f4667e1fa3..4a3402898f2a 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c | |||
| @@ -422,7 +422,9 @@ static void veth_dellink(struct net_device *dev, struct list_head *head) | |||
| 422 | unregister_netdevice_queue(peer, head); | 422 | unregister_netdevice_queue(peer, head); |
| 423 | } | 423 | } |
| 424 | 424 | ||
| 425 | static const struct nla_policy veth_policy[VETH_INFO_MAX + 1]; | 425 | static const struct nla_policy veth_policy[VETH_INFO_MAX + 1] = { |
| 426 | [VETH_INFO_PEER] = { .len = sizeof(struct ifinfomsg) }, | ||
| 427 | }; | ||
| 426 | 428 | ||
| 427 | static struct rtnl_link_ops veth_link_ops = { | 429 | static struct rtnl_link_ops veth_link_ops = { |
| 428 | .kind = DRV_NAME, | 430 | .kind = DRV_NAME, |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 39e0907a3c4e..9245d882c06a 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
| @@ -1501,7 +1501,7 @@ static int rtl_pci_init(struct ieee80211_hw *hw, struct pci_dev *pdev) | |||
| 1501 | return err; | 1501 | return err; |
| 1502 | } | 1502 | } |
| 1503 | 1503 | ||
| 1504 | return 1; | 1504 | return 0; |
| 1505 | } | 1505 | } |
| 1506 | 1506 | ||
| 1507 | static int rtl_pci_start(struct ieee80211_hw *hw) | 1507 | static int rtl_pci_start(struct ieee80211_hw *hw) |
| @@ -1870,7 +1870,7 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev, | |||
| 1870 | } | 1870 | } |
| 1871 | 1871 | ||
| 1872 | /* Init PCI sw */ | 1872 | /* Init PCI sw */ |
| 1873 | err = !rtl_pci_init(hw, pdev); | 1873 | err = rtl_pci_init(hw, pdev); |
| 1874 | if (err) { | 1874 | if (err) { |
| 1875 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 1875 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, |
| 1876 | ("Failed to init PCI.\n")); | 1876 | ("Failed to init PCI.\n")); |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 556b08298669..ddefc513b44a 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -194,7 +194,7 @@ static void netpoll_poll_dev(struct net_device *dev) | |||
| 194 | 194 | ||
| 195 | poll_napi(dev); | 195 | poll_napi(dev); |
| 196 | 196 | ||
| 197 | if (dev->priv_flags & IFF_SLAVE) { | 197 | if (dev->flags & IFF_SLAVE) { |
| 198 | if (dev->npinfo) { | 198 | if (dev->npinfo) { |
| 199 | struct net_device *bond_dev = dev->master; | 199 | struct net_device *bond_dev = dev->master; |
| 200 | struct sk_buff *skb; | 200 | struct sk_buff *skb; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 976034f82320..53c8ce4046b2 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1307,25 +1307,26 @@ static int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb, | |||
| 1307 | return in_sack; | 1307 | return in_sack; |
| 1308 | } | 1308 | } |
| 1309 | 1309 | ||
| 1310 | static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | 1310 | /* Mark the given newly-SACKed range as such, adjusting counters and hints. */ |
| 1311 | struct tcp_sacktag_state *state, | 1311 | static u8 tcp_sacktag_one(struct sock *sk, |
| 1312 | struct tcp_sacktag_state *state, u8 sacked, | ||
| 1313 | u32 start_seq, u32 end_seq, | ||
| 1312 | int dup_sack, int pcount) | 1314 | int dup_sack, int pcount) |
| 1313 | { | 1315 | { |
| 1314 | struct tcp_sock *tp = tcp_sk(sk); | 1316 | struct tcp_sock *tp = tcp_sk(sk); |
| 1315 | u8 sacked = TCP_SKB_CB(skb)->sacked; | ||
| 1316 | int fack_count = state->fack_count; | 1317 | int fack_count = state->fack_count; |
| 1317 | 1318 | ||
| 1318 | /* Account D-SACK for retransmitted packet. */ | 1319 | /* Account D-SACK for retransmitted packet. */ |
| 1319 | if (dup_sack && (sacked & TCPCB_RETRANS)) { | 1320 | if (dup_sack && (sacked & TCPCB_RETRANS)) { |
| 1320 | if (tp->undo_marker && tp->undo_retrans && | 1321 | if (tp->undo_marker && tp->undo_retrans && |
| 1321 | after(TCP_SKB_CB(skb)->end_seq, tp->undo_marker)) | 1322 | after(end_seq, tp->undo_marker)) |
| 1322 | tp->undo_retrans--; | 1323 | tp->undo_retrans--; |
| 1323 | if (sacked & TCPCB_SACKED_ACKED) | 1324 | if (sacked & TCPCB_SACKED_ACKED) |
| 1324 | state->reord = min(fack_count, state->reord); | 1325 | state->reord = min(fack_count, state->reord); |
| 1325 | } | 1326 | } |
| 1326 | 1327 | ||
| 1327 | /* Nothing to do; acked frame is about to be dropped (was ACKed). */ | 1328 | /* Nothing to do; acked frame is about to be dropped (was ACKed). */ |
| 1328 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->snd_una)) | 1329 | if (!after(end_seq, tp->snd_una)) |
| 1329 | return sacked; | 1330 | return sacked; |
| 1330 | 1331 | ||
| 1331 | if (!(sacked & TCPCB_SACKED_ACKED)) { | 1332 | if (!(sacked & TCPCB_SACKED_ACKED)) { |
| @@ -1344,13 +1345,13 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | |||
| 1344 | /* New sack for not retransmitted frame, | 1345 | /* New sack for not retransmitted frame, |
| 1345 | * which was in hole. It is reordering. | 1346 | * which was in hole. It is reordering. |
| 1346 | */ | 1347 | */ |
| 1347 | if (before(TCP_SKB_CB(skb)->seq, | 1348 | if (before(start_seq, |
| 1348 | tcp_highest_sack_seq(tp))) | 1349 | tcp_highest_sack_seq(tp))) |
| 1349 | state->reord = min(fack_count, | 1350 | state->reord = min(fack_count, |
| 1350 | state->reord); | 1351 | state->reord); |
| 1351 | 1352 | ||
| 1352 | /* SACK enhanced F-RTO (RFC4138; Appendix B) */ | 1353 | /* SACK enhanced F-RTO (RFC4138; Appendix B) */ |
| 1353 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->frto_highmark)) | 1354 | if (!after(end_seq, tp->frto_highmark)) |
| 1354 | state->flag |= FLAG_ONLY_ORIG_SACKED; | 1355 | state->flag |= FLAG_ONLY_ORIG_SACKED; |
| 1355 | } | 1356 | } |
| 1356 | 1357 | ||
| @@ -1368,8 +1369,7 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | |||
| 1368 | 1369 | ||
| 1369 | /* Lost marker hint past SACKed? Tweak RFC3517 cnt */ | 1370 | /* Lost marker hint past SACKed? Tweak RFC3517 cnt */ |
| 1370 | if (!tcp_is_fack(tp) && (tp->lost_skb_hint != NULL) && | 1371 | if (!tcp_is_fack(tp) && (tp->lost_skb_hint != NULL) && |
| 1371 | before(TCP_SKB_CB(skb)->seq, | 1372 | before(start_seq, TCP_SKB_CB(tp->lost_skb_hint)->seq)) |
| 1372 | TCP_SKB_CB(tp->lost_skb_hint)->seq)) | ||
| 1373 | tp->lost_cnt_hint += pcount; | 1373 | tp->lost_cnt_hint += pcount; |
| 1374 | 1374 | ||
| 1375 | if (fack_count > tp->fackets_out) | 1375 | if (fack_count > tp->fackets_out) |
| @@ -1388,6 +1388,9 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | |||
| 1388 | return sacked; | 1388 | return sacked; |
| 1389 | } | 1389 | } |
| 1390 | 1390 | ||
| 1391 | /* Shift newly-SACKed bytes from this skb to the immediately previous | ||
| 1392 | * already-SACKed sk_buff. Mark the newly-SACKed bytes as such. | ||
| 1393 | */ | ||
| 1391 | static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | 1394 | static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, |
| 1392 | struct tcp_sacktag_state *state, | 1395 | struct tcp_sacktag_state *state, |
| 1393 | unsigned int pcount, int shifted, int mss, | 1396 | unsigned int pcount, int shifted, int mss, |
| @@ -1395,10 +1398,13 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | |||
| 1395 | { | 1398 | { |
| 1396 | struct tcp_sock *tp = tcp_sk(sk); | 1399 | struct tcp_sock *tp = tcp_sk(sk); |
| 1397 | struct sk_buff *prev = tcp_write_queue_prev(sk, skb); | 1400 | struct sk_buff *prev = tcp_write_queue_prev(sk, skb); |
| 1401 | u32 start_seq = TCP_SKB_CB(skb)->seq; /* start of newly-SACKed */ | ||
| 1402 | u32 end_seq = start_seq + shifted; /* end of newly-SACKed */ | ||
| 1398 | 1403 | ||
| 1399 | BUG_ON(!pcount); | 1404 | BUG_ON(!pcount); |
| 1400 | 1405 | ||
| 1401 | if (skb == tp->lost_skb_hint) | 1406 | /* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */ |
| 1407 | if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint)) | ||
| 1402 | tp->lost_cnt_hint += pcount; | 1408 | tp->lost_cnt_hint += pcount; |
| 1403 | 1409 | ||
| 1404 | TCP_SKB_CB(prev)->end_seq += shifted; | 1410 | TCP_SKB_CB(prev)->end_seq += shifted; |
| @@ -1424,8 +1430,11 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | |||
| 1424 | skb_shinfo(skb)->gso_type = 0; | 1430 | skb_shinfo(skb)->gso_type = 0; |
| 1425 | } | 1431 | } |
| 1426 | 1432 | ||
| 1427 | /* We discard results */ | 1433 | /* Adjust counters and hints for the newly sacked sequence range but |
| 1428 | tcp_sacktag_one(skb, sk, state, dup_sack, pcount); | 1434 | * discard the return value since prev is already marked. |
| 1435 | */ | ||
| 1436 | tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked, | ||
| 1437 | start_seq, end_seq, dup_sack, pcount); | ||
| 1429 | 1438 | ||
| 1430 | /* Difference in this won't matter, both ACKed by the same cumul. ACK */ | 1439 | /* Difference in this won't matter, both ACKed by the same cumul. ACK */ |
| 1431 | TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); | 1440 | TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); |
| @@ -1664,10 +1673,14 @@ static struct sk_buff *tcp_sacktag_walk(struct sk_buff *skb, struct sock *sk, | |||
| 1664 | break; | 1673 | break; |
| 1665 | 1674 | ||
| 1666 | if (in_sack) { | 1675 | if (in_sack) { |
| 1667 | TCP_SKB_CB(skb)->sacked = tcp_sacktag_one(skb, sk, | 1676 | TCP_SKB_CB(skb)->sacked = |
| 1668 | state, | 1677 | tcp_sacktag_one(sk, |
| 1669 | dup_sack, | 1678 | state, |
| 1670 | tcp_skb_pcount(skb)); | 1679 | TCP_SKB_CB(skb)->sacked, |
| 1680 | TCP_SKB_CB(skb)->seq, | ||
| 1681 | TCP_SKB_CB(skb)->end_seq, | ||
| 1682 | dup_sack, | ||
| 1683 | tcp_skb_pcount(skb)); | ||
| 1671 | 1684 | ||
| 1672 | if (!before(TCP_SKB_CB(skb)->seq, | 1685 | if (!before(TCP_SKB_CB(skb)->seq, |
| 1673 | tcp_highest_sack_seq(tp))) | 1686 | tcp_highest_sack_seq(tp))) |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 0a0d94ad9b08..b142bd4c2390 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
| @@ -910,6 +910,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
| 910 | wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n", | 910 | wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n", |
| 911 | result); | 911 | result); |
| 912 | 912 | ||
| 913 | ieee80211_led_init(local); | ||
| 914 | |||
| 913 | rtnl_lock(); | 915 | rtnl_lock(); |
| 914 | 916 | ||
| 915 | result = ieee80211_init_rate_ctrl_alg(local, | 917 | result = ieee80211_init_rate_ctrl_alg(local, |
| @@ -931,8 +933,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
| 931 | 933 | ||
| 932 | rtnl_unlock(); | 934 | rtnl_unlock(); |
| 933 | 935 | ||
| 934 | ieee80211_led_init(local); | ||
| 935 | |||
| 936 | local->network_latency_notifier.notifier_call = | 936 | local->network_latency_notifier.notifier_call = |
| 937 | ieee80211_max_network_latency; | 937 | ieee80211_max_network_latency; |
| 938 | result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY, | 938 | result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY, |
diff --git a/net/rxrpc/ar-key.c b/net/rxrpc/ar-key.c index 4cba13e46ffd..ae3a035f5390 100644 --- a/net/rxrpc/ar-key.c +++ b/net/rxrpc/ar-key.c | |||
| @@ -232,7 +232,7 @@ static int rxrpc_krb5_decode_principal(struct krb5_principal *princ, | |||
| 232 | if (toklen <= (n_parts + 1) * 4) | 232 | if (toklen <= (n_parts + 1) * 4) |
| 233 | return -EINVAL; | 233 | return -EINVAL; |
| 234 | 234 | ||
| 235 | princ->name_parts = kcalloc(sizeof(char *), n_parts, GFP_KERNEL); | 235 | princ->name_parts = kcalloc(n_parts, sizeof(char *), GFP_KERNEL); |
| 236 | if (!princ->name_parts) | 236 | if (!princ->name_parts) |
| 237 | return -ENOMEM; | 237 | return -ENOMEM; |
| 238 | 238 | ||
| @@ -355,7 +355,7 @@ static int rxrpc_krb5_decode_tagged_array(struct krb5_tagged_data **_td, | |||
| 355 | 355 | ||
| 356 | _debug("n_elem %d", n_elem); | 356 | _debug("n_elem %d", n_elem); |
| 357 | 357 | ||
| 358 | td = kcalloc(sizeof(struct krb5_tagged_data), n_elem, | 358 | td = kcalloc(n_elem, sizeof(struct krb5_tagged_data), |
| 359 | GFP_KERNEL); | 359 | GFP_KERNEL); |
| 360 | if (!td) | 360 | if (!td) |
| 361 | return -ENOMEM; | 361 | return -ENOMEM; |
