diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/isdn/mISDN/socket.c | 1 | ||||
-rw-r--r-- | drivers/isdn/sc/init.c | 4 | ||||
-rw-r--r-- | drivers/net/bonding/bond_main.c | 6 | ||||
-rw-r--r-- | drivers/net/caif/caif_spi.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | 19 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 32 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 70 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 13 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 121 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/gianfar_ptp.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/mcdi.c | 2 | ||||
-rw-r--r-- | drivers/net/tun.c | 15 |
16 files changed, 251 insertions, 66 deletions
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index 8b07f83d48ad..e47dcb9d1e91 100644 --- a/drivers/isdn/mISDN/socket.c +++ b/drivers/isdn/mISDN/socket.c | |||
@@ -578,6 +578,7 @@ data_sock_getname(struct socket *sock, struct sockaddr *addr, | |||
578 | lock_sock(sk); | 578 | lock_sock(sk); |
579 | 579 | ||
580 | *addr_len = sizeof(*maddr); | 580 | *addr_len = sizeof(*maddr); |
581 | maddr->family = AF_ISDN; | ||
581 | maddr->dev = _pms(sk)->dev->id; | 582 | maddr->dev = _pms(sk)->dev->id; |
582 | maddr->channel = _pms(sk)->ch.nr; | 583 | maddr->channel = _pms(sk)->ch.nr; |
583 | maddr->sapi = _pms(sk)->ch.addr & 0xff; | 584 | maddr->sapi = _pms(sk)->ch.addr & 0xff; |
diff --git a/drivers/isdn/sc/init.c b/drivers/isdn/sc/init.c index 6b580b2c717f..ca997bd4e818 100644 --- a/drivers/isdn/sc/init.c +++ b/drivers/isdn/sc/init.c | |||
@@ -33,8 +33,8 @@ static unsigned long ram[] = {0, 0, 0, 0}; | |||
33 | static bool do_reset = 0; | 33 | static bool do_reset = 0; |
34 | 34 | ||
35 | module_param_array(io, int, NULL, 0); | 35 | module_param_array(io, int, NULL, 0); |
36 | module_param_array(irq, int, NULL, 0); | 36 | module_param_array(irq, byte, NULL, 0); |
37 | module_param_array(ram, int, NULL, 0); | 37 | module_param_array(ram, long, NULL, 0); |
38 | module_param(do_reset, bool, 0); | 38 | module_param(do_reset, bool, 0); |
39 | 39 | ||
40 | static int identify_board(unsigned long, unsigned int); | 40 | static int identify_board(unsigned long, unsigned int); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 532153db1f9c..d0aade04e49a 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1917,14 +1917,16 @@ err_detach: | |||
1917 | bond_detach_slave(bond, new_slave); | 1917 | bond_detach_slave(bond, new_slave); |
1918 | if (bond->primary_slave == new_slave) | 1918 | if (bond->primary_slave == new_slave) |
1919 | bond->primary_slave = NULL; | 1919 | bond->primary_slave = NULL; |
1920 | write_unlock_bh(&bond->lock); | ||
1921 | if (bond->curr_active_slave == new_slave) { | 1920 | if (bond->curr_active_slave == new_slave) { |
1921 | bond_change_active_slave(bond, NULL); | ||
1922 | write_unlock_bh(&bond->lock); | ||
1922 | read_lock(&bond->lock); | 1923 | read_lock(&bond->lock); |
1923 | write_lock_bh(&bond->curr_slave_lock); | 1924 | write_lock_bh(&bond->curr_slave_lock); |
1924 | bond_change_active_slave(bond, NULL); | ||
1925 | bond_select_active_slave(bond); | 1925 | bond_select_active_slave(bond); |
1926 | write_unlock_bh(&bond->curr_slave_lock); | 1926 | write_unlock_bh(&bond->curr_slave_lock); |
1927 | read_unlock(&bond->lock); | 1927 | read_unlock(&bond->lock); |
1928 | } else { | ||
1929 | write_unlock_bh(&bond->lock); | ||
1928 | } | 1930 | } |
1929 | slave_disable_netpoll(new_slave); | 1931 | slave_disable_netpoll(new_slave); |
1930 | 1932 | ||
diff --git a/drivers/net/caif/caif_spi.c b/drivers/net/caif/caif_spi.c index 2fb279a63c50..155db68e13ba 100644 --- a/drivers/net/caif/caif_spi.c +++ b/drivers/net/caif/caif_spi.c | |||
@@ -863,6 +863,7 @@ static int __init cfspi_init_module(void) | |||
863 | driver_remove_file(&cfspi_spi_driver.driver, | 863 | driver_remove_file(&cfspi_spi_driver.driver, |
864 | &driver_attr_up_head_align); | 864 | &driver_attr_up_head_align); |
865 | err_create_up_head_align: | 865 | err_create_up_head_align: |
866 | platform_driver_unregister(&cfspi_spi_driver); | ||
866 | err_dev_register: | 867 | err_dev_register: |
867 | return result; | 868 | return result; |
868 | } | 869 | } |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 466b512cda4f..b8fbe266ab68 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
@@ -1044,6 +1044,7 @@ static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie) | |||
1044 | DP(NETIF_MSG_INTR, | 1044 | DP(NETIF_MSG_INTR, |
1045 | "got an MSI-X interrupt on IDX:SB [fp %d fw_sd %d igusb %d]\n", | 1045 | "got an MSI-X interrupt on IDX:SB [fp %d fw_sd %d igusb %d]\n", |
1046 | fp->index, fp->fw_sb_id, fp->igu_sb_id); | 1046 | fp->index, fp->fw_sb_id, fp->igu_sb_id); |
1047 | |||
1047 | bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID, 0, IGU_INT_DISABLE, 0); | 1048 | bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID, 0, IGU_INT_DISABLE, 0); |
1048 | 1049 | ||
1049 | #ifdef BNX2X_STOP_ON_ERROR | 1050 | #ifdef BNX2X_STOP_ON_ERROR |
@@ -1725,7 +1726,7 @@ static int bnx2x_req_irq(struct bnx2x *bp) | |||
1725 | return request_irq(irq, bnx2x_interrupt, flags, bp->dev->name, bp->dev); | 1726 | return request_irq(irq, bnx2x_interrupt, flags, bp->dev->name, bp->dev); |
1726 | } | 1727 | } |
1727 | 1728 | ||
1728 | static int bnx2x_setup_irqs(struct bnx2x *bp) | 1729 | int bnx2x_setup_irqs(struct bnx2x *bp) |
1729 | { | 1730 | { |
1730 | int rc = 0; | 1731 | int rc = 0; |
1731 | if (bp->flags & USING_MSIX_FLAG && | 1732 | if (bp->flags & USING_MSIX_FLAG && |
@@ -2581,6 +2582,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
2581 | } | 2582 | } |
2582 | } | 2583 | } |
2583 | 2584 | ||
2585 | bnx2x_pre_irq_nic_init(bp); | ||
2586 | |||
2584 | /* Connect to IRQs */ | 2587 | /* Connect to IRQs */ |
2585 | rc = bnx2x_setup_irqs(bp); | 2588 | rc = bnx2x_setup_irqs(bp); |
2586 | if (rc) { | 2589 | if (rc) { |
@@ -2590,11 +2593,11 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
2590 | LOAD_ERROR_EXIT(bp, load_error2); | 2593 | LOAD_ERROR_EXIT(bp, load_error2); |
2591 | } | 2594 | } |
2592 | 2595 | ||
2593 | /* Setup NIC internals and enable interrupts */ | ||
2594 | bnx2x_nic_init(bp, load_code); | ||
2595 | |||
2596 | /* Init per-function objects */ | 2596 | /* Init per-function objects */ |
2597 | if (IS_PF(bp)) { | 2597 | if (IS_PF(bp)) { |
2598 | /* Setup NIC internals and enable interrupts */ | ||
2599 | bnx2x_post_irq_nic_init(bp, load_code); | ||
2600 | |||
2598 | bnx2x_init_bp_objs(bp); | 2601 | bnx2x_init_bp_objs(bp); |
2599 | bnx2x_iov_nic_init(bp); | 2602 | bnx2x_iov_nic_init(bp); |
2600 | 2603 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h index 54e1b149acb3..151675d66b0d 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | |||
@@ -295,16 +295,29 @@ void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw); | |||
295 | void bnx2x_nic_init_cnic(struct bnx2x *bp); | 295 | void bnx2x_nic_init_cnic(struct bnx2x *bp); |
296 | 296 | ||
297 | /** | 297 | /** |
298 | * bnx2x_nic_init - init driver internals. | 298 | * bnx2x_preirq_nic_init - init driver internals. |
299 | * | 299 | * |
300 | * @bp: driver handle | 300 | * @bp: driver handle |
301 | * | 301 | * |
302 | * Initializes: | 302 | * Initializes: |
303 | * - rings | 303 | * - fastpath object |
304 | * - fastpath rings | ||
305 | * etc. | ||
306 | */ | ||
307 | void bnx2x_pre_irq_nic_init(struct bnx2x *bp); | ||
308 | |||
309 | /** | ||
310 | * bnx2x_postirq_nic_init - init driver internals. | ||
311 | * | ||
312 | * @bp: driver handle | ||
313 | * @load_code: COMMON, PORT or FUNCTION | ||
314 | * | ||
315 | * Initializes: | ||
304 | * - status blocks | 316 | * - status blocks |
317 | * - slowpath rings | ||
305 | * - etc. | 318 | * - etc. |
306 | */ | 319 | */ |
307 | void bnx2x_nic_init(struct bnx2x *bp, u32 load_code); | 320 | void bnx2x_post_irq_nic_init(struct bnx2x *bp, u32 load_code); |
308 | /** | 321 | /** |
309 | * bnx2x_alloc_mem_cnic - allocate driver's memory for cnic. | 322 | * bnx2x_alloc_mem_cnic - allocate driver's memory for cnic. |
310 | * | 323 | * |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 91a0434ce1bd..a024eec94be1 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -6030,10 +6030,11 @@ void bnx2x_nic_init_cnic(struct bnx2x *bp) | |||
6030 | mmiowb(); | 6030 | mmiowb(); |
6031 | } | 6031 | } |
6032 | 6032 | ||
6033 | void bnx2x_nic_init(struct bnx2x *bp, u32 load_code) | 6033 | void bnx2x_pre_irq_nic_init(struct bnx2x *bp) |
6034 | { | 6034 | { |
6035 | int i; | 6035 | int i; |
6036 | 6036 | ||
6037 | /* Setup NIC internals and enable interrupts */ | ||
6037 | for_each_eth_queue(bp, i) | 6038 | for_each_eth_queue(bp, i) |
6038 | bnx2x_init_eth_fp(bp, i); | 6039 | bnx2x_init_eth_fp(bp, i); |
6039 | 6040 | ||
@@ -6041,19 +6042,27 @@ void bnx2x_nic_init(struct bnx2x *bp, u32 load_code) | |||
6041 | rmb(); | 6042 | rmb(); |
6042 | bnx2x_init_rx_rings(bp); | 6043 | bnx2x_init_rx_rings(bp); |
6043 | bnx2x_init_tx_rings(bp); | 6044 | bnx2x_init_tx_rings(bp); |
6045 | |||
6044 | if (IS_VF(bp)) { | 6046 | if (IS_VF(bp)) { |
6045 | bnx2x_memset_stats(bp); | 6047 | bnx2x_memset_stats(bp); |
6046 | return; | 6048 | return; |
6047 | } | 6049 | } |
6048 | 6050 | ||
6049 | /* Initialize MOD_ABS interrupts */ | 6051 | if (IS_PF(bp)) { |
6050 | bnx2x_init_mod_abs_int(bp, &bp->link_vars, bp->common.chip_id, | 6052 | /* Initialize MOD_ABS interrupts */ |
6051 | bp->common.shmem_base, bp->common.shmem2_base, | 6053 | bnx2x_init_mod_abs_int(bp, &bp->link_vars, bp->common.chip_id, |
6052 | BP_PORT(bp)); | 6054 | bp->common.shmem_base, |
6055 | bp->common.shmem2_base, BP_PORT(bp)); | ||
6056 | |||
6057 | /* initialize the default status block and sp ring */ | ||
6058 | bnx2x_init_def_sb(bp); | ||
6059 | bnx2x_update_dsb_idx(bp); | ||
6060 | bnx2x_init_sp_ring(bp); | ||
6061 | } | ||
6062 | } | ||
6053 | 6063 | ||
6054 | bnx2x_init_def_sb(bp); | 6064 | void bnx2x_post_irq_nic_init(struct bnx2x *bp, u32 load_code) |
6055 | bnx2x_update_dsb_idx(bp); | 6065 | { |
6056 | bnx2x_init_sp_ring(bp); | ||
6057 | bnx2x_init_eq_ring(bp); | 6066 | bnx2x_init_eq_ring(bp); |
6058 | bnx2x_init_internal(bp, load_code); | 6067 | bnx2x_init_internal(bp, load_code); |
6059 | bnx2x_pf_init(bp); | 6068 | bnx2x_pf_init(bp); |
@@ -6071,12 +6080,7 @@ void bnx2x_nic_init(struct bnx2x *bp, u32 load_code) | |||
6071 | AEU_INPUTS_ATTN_BITS_SPIO5); | 6080 | AEU_INPUTS_ATTN_BITS_SPIO5); |
6072 | } | 6081 | } |
6073 | 6082 | ||
6074 | /* end of nic init */ | 6083 | /* gzip service functions */ |
6075 | |||
6076 | /* | ||
6077 | * gzip service functions | ||
6078 | */ | ||
6079 | |||
6080 | static int bnx2x_gunzip_init(struct bnx2x *bp) | 6084 | static int bnx2x_gunzip_init(struct bnx2x *bp) |
6081 | { | 6085 | { |
6082 | bp->gunzip_buf = dma_alloc_coherent(&bp->pdev->dev, FW_BUF_SIZE, | 6086 | bp->gunzip_buf = dma_alloc_coherent(&bp->pdev->dev, FW_BUF_SIZE, |
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 9045903dcda3..234ce6f07544 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -329,6 +329,7 @@ enum vf_state { | |||
329 | #define BE_FLAGS_WORKER_SCHEDULED (1 << 3) | 329 | #define BE_FLAGS_WORKER_SCHEDULED (1 << 3) |
330 | #define BE_UC_PMAC_COUNT 30 | 330 | #define BE_UC_PMAC_COUNT 30 |
331 | #define BE_VF_UC_PMAC_COUNT 2 | 331 | #define BE_VF_UC_PMAC_COUNT 2 |
332 | #define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11) | ||
332 | 333 | ||
333 | struct phy_info { | 334 | struct phy_info { |
334 | u8 transceiver; | 335 | u8 transceiver; |
@@ -436,6 +437,7 @@ struct be_adapter { | |||
436 | bool wol; | 437 | bool wol; |
437 | u32 uc_macs; /* Count of secondary UC MAC programmed */ | 438 | u32 uc_macs; /* Count of secondary UC MAC programmed */ |
438 | u16 asic_rev; | 439 | u16 asic_rev; |
440 | u16 qnq_vid; | ||
439 | u32 msg_enable; | 441 | u32 msg_enable; |
440 | int be_get_temp_freq; | 442 | int be_get_temp_freq; |
441 | u16 max_mcast_mac; | 443 | u16 max_mcast_mac; |
@@ -651,6 +653,11 @@ static inline bool be_is_wol_excluded(struct be_adapter *adapter) | |||
651 | } | 653 | } |
652 | } | 654 | } |
653 | 655 | ||
656 | static inline int qnq_async_evt_rcvd(struct be_adapter *adapter) | ||
657 | { | ||
658 | return adapter->flags & BE_FLAGS_QNQ_ASYNC_EVT_RCVD; | ||
659 | } | ||
660 | |||
654 | extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, | 661 | extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, |
655 | u16 num_popped); | 662 | u16 num_popped); |
656 | extern void be_link_status_update(struct be_adapter *adapter, u8 link_status); | 663 | extern void be_link_status_update(struct be_adapter *adapter, u8 link_status); |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 9080c2775e9f..25d3290b8cac 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -263,6 +263,27 @@ static void be_async_grp5_evt_process(struct be_adapter *adapter, | |||
263 | } | 263 | } |
264 | } | 264 | } |
265 | 265 | ||
266 | static void be_async_dbg_evt_process(struct be_adapter *adapter, | ||
267 | u32 trailer, struct be_mcc_compl *cmp) | ||
268 | { | ||
269 | u8 event_type = 0; | ||
270 | struct be_async_event_qnq *evt = (struct be_async_event_qnq *) cmp; | ||
271 | |||
272 | event_type = (trailer >> ASYNC_TRAILER_EVENT_TYPE_SHIFT) & | ||
273 | ASYNC_TRAILER_EVENT_TYPE_MASK; | ||
274 | |||
275 | switch (event_type) { | ||
276 | case ASYNC_DEBUG_EVENT_TYPE_QNQ: | ||
277 | if (evt->valid) | ||
278 | adapter->qnq_vid = le16_to_cpu(evt->vlan_tag); | ||
279 | adapter->flags |= BE_FLAGS_QNQ_ASYNC_EVT_RCVD; | ||
280 | break; | ||
281 | default: | ||
282 | dev_warn(&adapter->pdev->dev, "Unknown debug event\n"); | ||
283 | break; | ||
284 | } | ||
285 | } | ||
286 | |||
266 | static inline bool is_link_state_evt(u32 trailer) | 287 | static inline bool is_link_state_evt(u32 trailer) |
267 | { | 288 | { |
268 | return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) & | 289 | return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) & |
@@ -277,6 +298,13 @@ static inline bool is_grp5_evt(u32 trailer) | |||
277 | ASYNC_EVENT_CODE_GRP_5); | 298 | ASYNC_EVENT_CODE_GRP_5); |
278 | } | 299 | } |
279 | 300 | ||
301 | static inline bool is_dbg_evt(u32 trailer) | ||
302 | { | ||
303 | return (((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) & | ||
304 | ASYNC_TRAILER_EVENT_CODE_MASK) == | ||
305 | ASYNC_EVENT_CODE_QNQ); | ||
306 | } | ||
307 | |||
280 | static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter) | 308 | static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter) |
281 | { | 309 | { |
282 | struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq; | 310 | struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq; |
@@ -325,6 +353,9 @@ int be_process_mcc(struct be_adapter *adapter) | |||
325 | else if (is_grp5_evt(compl->flags)) | 353 | else if (is_grp5_evt(compl->flags)) |
326 | be_async_grp5_evt_process(adapter, | 354 | be_async_grp5_evt_process(adapter, |
327 | compl->flags, compl); | 355 | compl->flags, compl); |
356 | else if (is_dbg_evt(compl->flags)) | ||
357 | be_async_dbg_evt_process(adapter, | ||
358 | compl->flags, compl); | ||
328 | } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { | 359 | } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) { |
329 | status = be_mcc_compl_process(adapter, compl); | 360 | status = be_mcc_compl_process(adapter, compl); |
330 | atomic_dec(&mcc_obj->q.used); | 361 | atomic_dec(&mcc_obj->q.used); |
@@ -1020,6 +1051,7 @@ int be_cmd_mccq_ext_create(struct be_adapter *adapter, | |||
1020 | 1051 | ||
1021 | /* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */ | 1052 | /* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */ |
1022 | req->async_event_bitmap[0] = cpu_to_le32(0x00000022); | 1053 | req->async_event_bitmap[0] = cpu_to_le32(0x00000022); |
1054 | req->async_event_bitmap[0] |= cpu_to_le32(1 << ASYNC_EVENT_CODE_QNQ); | ||
1023 | be_dws_cpu_to_le(ctxt, sizeof(req->context)); | 1055 | be_dws_cpu_to_le(ctxt, sizeof(req->context)); |
1024 | 1056 | ||
1025 | be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); | 1057 | be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); |
@@ -2457,6 +2489,9 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter) | |||
2457 | struct mgmt_controller_attrib *attribs; | 2489 | struct mgmt_controller_attrib *attribs; |
2458 | struct be_dma_mem attribs_cmd; | 2490 | struct be_dma_mem attribs_cmd; |
2459 | 2491 | ||
2492 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | ||
2493 | return -1; | ||
2494 | |||
2460 | memset(&attribs_cmd, 0, sizeof(struct be_dma_mem)); | 2495 | memset(&attribs_cmd, 0, sizeof(struct be_dma_mem)); |
2461 | attribs_cmd.size = sizeof(struct be_cmd_resp_cntl_attribs); | 2496 | attribs_cmd.size = sizeof(struct be_cmd_resp_cntl_attribs); |
2462 | attribs_cmd.va = pci_alloc_consistent(adapter->pdev, attribs_cmd.size, | 2497 | attribs_cmd.va = pci_alloc_consistent(adapter->pdev, attribs_cmd.size, |
@@ -2464,12 +2499,10 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter) | |||
2464 | if (!attribs_cmd.va) { | 2499 | if (!attribs_cmd.va) { |
2465 | dev_err(&adapter->pdev->dev, | 2500 | dev_err(&adapter->pdev->dev, |
2466 | "Memory allocation failure\n"); | 2501 | "Memory allocation failure\n"); |
2467 | return -ENOMEM; | 2502 | status = -ENOMEM; |
2503 | goto err; | ||
2468 | } | 2504 | } |
2469 | 2505 | ||
2470 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | ||
2471 | return -1; | ||
2472 | |||
2473 | wrb = wrb_from_mbox(adapter); | 2506 | wrb = wrb_from_mbox(adapter); |
2474 | if (!wrb) { | 2507 | if (!wrb) { |
2475 | status = -EBUSY; | 2508 | status = -EBUSY; |
@@ -2489,8 +2522,9 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter) | |||
2489 | 2522 | ||
2490 | err: | 2523 | err: |
2491 | mutex_unlock(&adapter->mbox_lock); | 2524 | mutex_unlock(&adapter->mbox_lock); |
2492 | pci_free_consistent(adapter->pdev, attribs_cmd.size, attribs_cmd.va, | 2525 | if (attribs_cmd.va) |
2493 | attribs_cmd.dma); | 2526 | pci_free_consistent(adapter->pdev, attribs_cmd.size, |
2527 | attribs_cmd.va, attribs_cmd.dma); | ||
2494 | return status; | 2528 | return status; |
2495 | } | 2529 | } |
2496 | 2530 | ||
@@ -2788,6 +2822,9 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter) | |||
2788 | CMD_SUBSYSTEM_ETH)) | 2822 | CMD_SUBSYSTEM_ETH)) |
2789 | return -EPERM; | 2823 | return -EPERM; |
2790 | 2824 | ||
2825 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | ||
2826 | return -1; | ||
2827 | |||
2791 | memset(&cmd, 0, sizeof(struct be_dma_mem)); | 2828 | memset(&cmd, 0, sizeof(struct be_dma_mem)); |
2792 | cmd.size = sizeof(struct be_cmd_resp_acpi_wol_magic_config_v1); | 2829 | cmd.size = sizeof(struct be_cmd_resp_acpi_wol_magic_config_v1); |
2793 | cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, | 2830 | cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, |
@@ -2795,12 +2832,10 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter) | |||
2795 | if (!cmd.va) { | 2832 | if (!cmd.va) { |
2796 | dev_err(&adapter->pdev->dev, | 2833 | dev_err(&adapter->pdev->dev, |
2797 | "Memory allocation failure\n"); | 2834 | "Memory allocation failure\n"); |
2798 | return -ENOMEM; | 2835 | status = -ENOMEM; |
2836 | goto err; | ||
2799 | } | 2837 | } |
2800 | 2838 | ||
2801 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | ||
2802 | return -1; | ||
2803 | |||
2804 | wrb = wrb_from_mbox(adapter); | 2839 | wrb = wrb_from_mbox(adapter); |
2805 | if (!wrb) { | 2840 | if (!wrb) { |
2806 | status = -EBUSY; | 2841 | status = -EBUSY; |
@@ -2831,7 +2866,8 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter) | |||
2831 | } | 2866 | } |
2832 | err: | 2867 | err: |
2833 | mutex_unlock(&adapter->mbox_lock); | 2868 | mutex_unlock(&adapter->mbox_lock); |
2834 | pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma); | 2869 | if (cmd.va) |
2870 | pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma); | ||
2835 | return status; | 2871 | return status; |
2836 | 2872 | ||
2837 | } | 2873 | } |
@@ -2964,16 +3000,18 @@ int be_cmd_get_func_config(struct be_adapter *adapter) | |||
2964 | int status; | 3000 | int status; |
2965 | struct be_dma_mem cmd; | 3001 | struct be_dma_mem cmd; |
2966 | 3002 | ||
3003 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | ||
3004 | return -1; | ||
3005 | |||
2967 | memset(&cmd, 0, sizeof(struct be_dma_mem)); | 3006 | memset(&cmd, 0, sizeof(struct be_dma_mem)); |
2968 | cmd.size = sizeof(struct be_cmd_resp_get_func_config); | 3007 | cmd.size = sizeof(struct be_cmd_resp_get_func_config); |
2969 | cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, | 3008 | cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, |
2970 | &cmd.dma); | 3009 | &cmd.dma); |
2971 | if (!cmd.va) { | 3010 | if (!cmd.va) { |
2972 | dev_err(&adapter->pdev->dev, "Memory alloc failure\n"); | 3011 | dev_err(&adapter->pdev->dev, "Memory alloc failure\n"); |
2973 | return -ENOMEM; | 3012 | status = -ENOMEM; |
3013 | goto err; | ||
2974 | } | 3014 | } |
2975 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | ||
2976 | return -1; | ||
2977 | 3015 | ||
2978 | wrb = wrb_from_mbox(adapter); | 3016 | wrb = wrb_from_mbox(adapter); |
2979 | if (!wrb) { | 3017 | if (!wrb) { |
@@ -3016,8 +3054,8 @@ int be_cmd_get_func_config(struct be_adapter *adapter) | |||
3016 | } | 3054 | } |
3017 | err: | 3055 | err: |
3018 | mutex_unlock(&adapter->mbox_lock); | 3056 | mutex_unlock(&adapter->mbox_lock); |
3019 | pci_free_consistent(adapter->pdev, cmd.size, | 3057 | if (cmd.va) |
3020 | cmd.va, cmd.dma); | 3058 | pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma); |
3021 | return status; | 3059 | return status; |
3022 | } | 3060 | } |
3023 | 3061 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h index 1b01e9b32794..a855668e0cc5 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.h +++ b/drivers/net/ethernet/emulex/benet/be_cmds.h | |||
@@ -84,6 +84,9 @@ struct be_mcc_compl { | |||
84 | #define ASYNC_EVENT_QOS_SPEED 0x1 | 84 | #define ASYNC_EVENT_QOS_SPEED 0x1 |
85 | #define ASYNC_EVENT_COS_PRIORITY 0x2 | 85 | #define ASYNC_EVENT_COS_PRIORITY 0x2 |
86 | #define ASYNC_EVENT_PVID_STATE 0x3 | 86 | #define ASYNC_EVENT_PVID_STATE 0x3 |
87 | #define ASYNC_EVENT_CODE_QNQ 0x6 | ||
88 | #define ASYNC_DEBUG_EVENT_TYPE_QNQ 1 | ||
89 | |||
87 | struct be_async_event_trailer { | 90 | struct be_async_event_trailer { |
88 | u32 code; | 91 | u32 code; |
89 | }; | 92 | }; |
@@ -144,6 +147,16 @@ struct be_async_event_grp5_pvid_state { | |||
144 | struct be_async_event_trailer trailer; | 147 | struct be_async_event_trailer trailer; |
145 | } __packed; | 148 | } __packed; |
146 | 149 | ||
150 | /* async event indicating outer VLAN tag in QnQ */ | ||
151 | struct be_async_event_qnq { | ||
152 | u8 valid; /* Indicates if outer VLAN is valid */ | ||
153 | u8 rsvd0; | ||
154 | u16 vlan_tag; | ||
155 | u32 event_tag; | ||
156 | u8 rsvd1[4]; | ||
157 | struct be_async_event_trailer trailer; | ||
158 | } __packed; | ||
159 | |||
147 | struct be_mcc_mailbox { | 160 | struct be_mcc_mailbox { |
148 | struct be_mcc_wrb wrb; | 161 | struct be_mcc_wrb wrb; |
149 | struct be_mcc_compl compl; | 162 | struct be_mcc_compl compl; |
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c index ec3050b3133e..5733cde88e2c 100644 --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c | |||
@@ -680,7 +680,8 @@ be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
680 | 680 | ||
681 | if (be_is_wol_supported(adapter)) { | 681 | if (be_is_wol_supported(adapter)) { |
682 | wol->supported |= WAKE_MAGIC; | 682 | wol->supported |= WAKE_MAGIC; |
683 | wol->wolopts |= WAKE_MAGIC; | 683 | if (adapter->wol) |
684 | wol->wolopts |= WAKE_MAGIC; | ||
684 | } else | 685 | } else |
685 | wol->wolopts = 0; | 686 | wol->wolopts = 0; |
686 | memset(&wol->sopass, 0, sizeof(wol->sopass)); | 687 | memset(&wol->sopass, 0, sizeof(wol->sopass)); |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 1c734915933f..4babc8a4a543 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -639,13 +639,8 @@ static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter, | |||
639 | return vlan_tag; | 639 | return vlan_tag; |
640 | } | 640 | } |
641 | 641 | ||
642 | static int be_vlan_tag_chk(struct be_adapter *adapter, struct sk_buff *skb) | ||
643 | { | ||
644 | return vlan_tx_tag_present(skb) || adapter->pvid; | ||
645 | } | ||
646 | |||
647 | static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr, | 642 | static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr, |
648 | struct sk_buff *skb, u32 wrb_cnt, u32 len) | 643 | struct sk_buff *skb, u32 wrb_cnt, u32 len, bool skip_hw_vlan) |
649 | { | 644 | { |
650 | u16 vlan_tag; | 645 | u16 vlan_tag; |
651 | 646 | ||
@@ -672,8 +667,9 @@ static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr, | |||
672 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag, hdr, vlan_tag); | 667 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag, hdr, vlan_tag); |
673 | } | 668 | } |
674 | 669 | ||
670 | /* To skip HW VLAN tagging: evt = 1, compl = 0 */ | ||
671 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, complete, hdr, !skip_hw_vlan); | ||
675 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1); | 672 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1); |
676 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, complete, hdr, 1); | ||
677 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, num_wrb, hdr, wrb_cnt); | 673 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, num_wrb, hdr, wrb_cnt); |
678 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, len, hdr, len); | 674 | AMAP_SET_BITS(struct amap_eth_hdr_wrb, len, hdr, len); |
679 | } | 675 | } |
@@ -696,7 +692,8 @@ static void unmap_tx_frag(struct device *dev, struct be_eth_wrb *wrb, | |||
696 | } | 692 | } |
697 | 693 | ||
698 | static int make_tx_wrbs(struct be_adapter *adapter, struct be_queue_info *txq, | 694 | static int make_tx_wrbs(struct be_adapter *adapter, struct be_queue_info *txq, |
699 | struct sk_buff *skb, u32 wrb_cnt, bool dummy_wrb) | 695 | struct sk_buff *skb, u32 wrb_cnt, bool dummy_wrb, |
696 | bool skip_hw_vlan) | ||
700 | { | 697 | { |
701 | dma_addr_t busaddr; | 698 | dma_addr_t busaddr; |
702 | int i, copied = 0; | 699 | int i, copied = 0; |
@@ -745,7 +742,7 @@ static int make_tx_wrbs(struct be_adapter *adapter, struct be_queue_info *txq, | |||
745 | queue_head_inc(txq); | 742 | queue_head_inc(txq); |
746 | } | 743 | } |
747 | 744 | ||
748 | wrb_fill_hdr(adapter, hdr, first_skb, wrb_cnt, copied); | 745 | wrb_fill_hdr(adapter, hdr, first_skb, wrb_cnt, copied, skip_hw_vlan); |
749 | be_dws_cpu_to_le(hdr, sizeof(*hdr)); | 746 | be_dws_cpu_to_le(hdr, sizeof(*hdr)); |
750 | 747 | ||
751 | return copied; | 748 | return copied; |
@@ -762,7 +759,8 @@ dma_err: | |||
762 | } | 759 | } |
763 | 760 | ||
764 | static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter, | 761 | static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter, |
765 | struct sk_buff *skb) | 762 | struct sk_buff *skb, |
763 | bool *skip_hw_vlan) | ||
766 | { | 764 | { |
767 | u16 vlan_tag = 0; | 765 | u16 vlan_tag = 0; |
768 | 766 | ||
@@ -777,9 +775,67 @@ static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter, | |||
777 | skb->vlan_tci = 0; | 775 | skb->vlan_tci = 0; |
778 | } | 776 | } |
779 | 777 | ||
778 | if (qnq_async_evt_rcvd(adapter) && adapter->pvid) { | ||
779 | if (!vlan_tag) | ||
780 | vlan_tag = adapter->pvid; | ||
781 | if (skip_hw_vlan) | ||
782 | *skip_hw_vlan = true; | ||
783 | } | ||
784 | |||
785 | if (vlan_tag) { | ||
786 | skb = __vlan_put_tag(skb, htons(ETH_P_8021Q), vlan_tag); | ||
787 | if (unlikely(!skb)) | ||
788 | return skb; | ||
789 | |||
790 | skb->vlan_tci = 0; | ||
791 | } | ||
792 | |||
793 | /* Insert the outer VLAN, if any */ | ||
794 | if (adapter->qnq_vid) { | ||
795 | vlan_tag = adapter->qnq_vid; | ||
796 | skb = __vlan_put_tag(skb, htons(ETH_P_8021Q), vlan_tag); | ||
797 | if (unlikely(!skb)) | ||
798 | return skb; | ||
799 | if (skip_hw_vlan) | ||
800 | *skip_hw_vlan = true; | ||
801 | } | ||
802 | |||
780 | return skb; | 803 | return skb; |
781 | } | 804 | } |
782 | 805 | ||
806 | static bool be_ipv6_exthdr_check(struct sk_buff *skb) | ||
807 | { | ||
808 | struct ethhdr *eh = (struct ethhdr *)skb->data; | ||
809 | u16 offset = ETH_HLEN; | ||
810 | |||
811 | if (eh->h_proto == htons(ETH_P_IPV6)) { | ||
812 | struct ipv6hdr *ip6h = (struct ipv6hdr *)(skb->data + offset); | ||
813 | |||
814 | offset += sizeof(struct ipv6hdr); | ||
815 | if (ip6h->nexthdr != NEXTHDR_TCP && | ||
816 | ip6h->nexthdr != NEXTHDR_UDP) { | ||
817 | struct ipv6_opt_hdr *ehdr = | ||
818 | (struct ipv6_opt_hdr *) (skb->data + offset); | ||
819 | |||
820 | /* offending pkt: 2nd byte following IPv6 hdr is 0xff */ | ||
821 | if (ehdr->hdrlen == 0xff) | ||
822 | return true; | ||
823 | } | ||
824 | } | ||
825 | return false; | ||
826 | } | ||
827 | |||
828 | static int be_vlan_tag_tx_chk(struct be_adapter *adapter, struct sk_buff *skb) | ||
829 | { | ||
830 | return vlan_tx_tag_present(skb) || adapter->pvid || adapter->qnq_vid; | ||
831 | } | ||
832 | |||
833 | static int be_ipv6_tx_stall_chk(struct be_adapter *adapter, struct sk_buff *skb) | ||
834 | { | ||
835 | return BE3_chip(adapter) && | ||
836 | be_ipv6_exthdr_check(skb); | ||
837 | } | ||
838 | |||
783 | static netdev_tx_t be_xmit(struct sk_buff *skb, | 839 | static netdev_tx_t be_xmit(struct sk_buff *skb, |
784 | struct net_device *netdev) | 840 | struct net_device *netdev) |
785 | { | 841 | { |
@@ -790,33 +846,64 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, | |||
790 | u32 wrb_cnt = 0, copied = 0; | 846 | u32 wrb_cnt = 0, copied = 0; |
791 | u32 start = txq->head, eth_hdr_len; | 847 | u32 start = txq->head, eth_hdr_len; |
792 | bool dummy_wrb, stopped = false; | 848 | bool dummy_wrb, stopped = false; |
849 | bool skip_hw_vlan = false; | ||
850 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | ||
793 | 851 | ||
794 | eth_hdr_len = ntohs(skb->protocol) == ETH_P_8021Q ? | 852 | eth_hdr_len = ntohs(skb->protocol) == ETH_P_8021Q ? |
795 | VLAN_ETH_HLEN : ETH_HLEN; | 853 | VLAN_ETH_HLEN : ETH_HLEN; |
796 | 854 | ||
797 | /* HW has a bug which considers padding bytes as legal | 855 | /* For padded packets, BE HW modifies tot_len field in IP header |
798 | * and modifies the IPv4 hdr's 'tot_len' field | 856 | * incorrecly when VLAN tag is inserted by HW. |
799 | */ | 857 | */ |
800 | if (skb->len <= 60 && be_vlan_tag_chk(adapter, skb) && | 858 | if (skb->len <= 60 && vlan_tx_tag_present(skb) && is_ipv4_pkt(skb)) { |
801 | is_ipv4_pkt(skb)) { | ||
802 | ip = (struct iphdr *)ip_hdr(skb); | 859 | ip = (struct iphdr *)ip_hdr(skb); |
803 | pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len)); | 860 | pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len)); |
804 | } | 861 | } |
805 | 862 | ||
863 | /* If vlan tag is already inlined in the packet, skip HW VLAN | ||
864 | * tagging in UMC mode | ||
865 | */ | ||
866 | if ((adapter->function_mode & UMC_ENABLED) && | ||
867 | veh->h_vlan_proto == htons(ETH_P_8021Q)) | ||
868 | skip_hw_vlan = true; | ||
869 | |||
806 | /* HW has a bug wherein it will calculate CSUM for VLAN | 870 | /* HW has a bug wherein it will calculate CSUM for VLAN |
807 | * pkts even though it is disabled. | 871 | * pkts even though it is disabled. |
808 | * Manually insert VLAN in pkt. | 872 | * Manually insert VLAN in pkt. |
809 | */ | 873 | */ |
810 | if (skb->ip_summed != CHECKSUM_PARTIAL && | 874 | if (skb->ip_summed != CHECKSUM_PARTIAL && |
811 | be_vlan_tag_chk(adapter, skb)) { | 875 | vlan_tx_tag_present(skb)) { |
812 | skb = be_insert_vlan_in_pkt(adapter, skb); | 876 | skb = be_insert_vlan_in_pkt(adapter, skb, &skip_hw_vlan); |
877 | if (unlikely(!skb)) | ||
878 | goto tx_drop; | ||
879 | } | ||
880 | |||
881 | /* HW may lockup when VLAN HW tagging is requested on | ||
882 | * certain ipv6 packets. Drop such pkts if the HW workaround to | ||
883 | * skip HW tagging is not enabled by FW. | ||
884 | */ | ||
885 | if (unlikely(be_ipv6_tx_stall_chk(adapter, skb) && | ||
886 | (adapter->pvid || adapter->qnq_vid) && | ||
887 | !qnq_async_evt_rcvd(adapter))) | ||
888 | goto tx_drop; | ||
889 | |||
890 | /* Manual VLAN tag insertion to prevent: | ||
891 | * ASIC lockup when the ASIC inserts VLAN tag into | ||
892 | * certain ipv6 packets. Insert VLAN tags in driver, | ||
893 | * and set event, completion, vlan bits accordingly | ||
894 | * in the Tx WRB. | ||
895 | */ | ||
896 | if (be_ipv6_tx_stall_chk(adapter, skb) && | ||
897 | be_vlan_tag_tx_chk(adapter, skb)) { | ||
898 | skb = be_insert_vlan_in_pkt(adapter, skb, &skip_hw_vlan); | ||
813 | if (unlikely(!skb)) | 899 | if (unlikely(!skb)) |
814 | goto tx_drop; | 900 | goto tx_drop; |
815 | } | 901 | } |
816 | 902 | ||
817 | wrb_cnt = wrb_cnt_for_skb(adapter, skb, &dummy_wrb); | 903 | wrb_cnt = wrb_cnt_for_skb(adapter, skb, &dummy_wrb); |
818 | 904 | ||
819 | copied = make_tx_wrbs(adapter, txq, skb, wrb_cnt, dummy_wrb); | 905 | copied = make_tx_wrbs(adapter, txq, skb, wrb_cnt, dummy_wrb, |
906 | skip_hw_vlan); | ||
820 | if (copied) { | 907 | if (copied) { |
821 | int gso_segs = skb_shinfo(skb)->gso_segs; | 908 | int gso_segs = skb_shinfo(skb)->gso_segs; |
822 | 909 | ||
diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c index fe8e9e5cfb2b..576e4b858fce 100644 --- a/drivers/net/ethernet/freescale/gianfar_ptp.c +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c | |||
@@ -130,7 +130,6 @@ struct gianfar_ptp_registers { | |||
130 | 130 | ||
131 | #define DRIVER "gianfar_ptp" | 131 | #define DRIVER "gianfar_ptp" |
132 | #define DEFAULT_CKSEL 1 | 132 | #define DEFAULT_CKSEL 1 |
133 | #define N_ALARM 1 /* first alarm is used internally to reset fipers */ | ||
134 | #define N_EXT_TS 2 | 133 | #define N_EXT_TS 2 |
135 | #define REG_SIZE sizeof(struct gianfar_ptp_registers) | 134 | #define REG_SIZE sizeof(struct gianfar_ptp_registers) |
136 | 135 | ||
@@ -413,7 +412,7 @@ static struct ptp_clock_info ptp_gianfar_caps = { | |||
413 | .owner = THIS_MODULE, | 412 | .owner = THIS_MODULE, |
414 | .name = "gianfar clock", | 413 | .name = "gianfar clock", |
415 | .max_adj = 512000, | 414 | .max_adj = 512000, |
416 | .n_alarm = N_ALARM, | 415 | .n_alarm = 0, |
417 | .n_ext_ts = N_EXT_TS, | 416 | .n_ext_ts = N_EXT_TS, |
418 | .n_per_out = 0, | 417 | .n_per_out = 0, |
419 | .pps = 1, | 418 | .pps = 1, |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index c6dac38fd9cc..79c520b64fdd 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -5896,6 +5896,14 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
5896 | goto err_stop_0; | 5896 | goto err_stop_0; |
5897 | } | 5897 | } |
5898 | 5898 | ||
5899 | /* 8168evl does not automatically pad to minimum length. */ | ||
5900 | if (unlikely(tp->mac_version == RTL_GIGA_MAC_VER_34 && | ||
5901 | skb->len < ETH_ZLEN)) { | ||
5902 | if (skb_padto(skb, ETH_ZLEN)) | ||
5903 | goto err_update_stats; | ||
5904 | skb_put(skb, ETH_ZLEN - skb->len); | ||
5905 | } | ||
5906 | |||
5899 | if (unlikely(le32_to_cpu(txd->opts1) & DescOwn)) | 5907 | if (unlikely(le32_to_cpu(txd->opts1) & DescOwn)) |
5900 | goto err_stop_0; | 5908 | goto err_stop_0; |
5901 | 5909 | ||
@@ -5967,6 +5975,7 @@ err_dma_1: | |||
5967 | rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd); | 5975 | rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd); |
5968 | err_dma_0: | 5976 | err_dma_0: |
5969 | dev_kfree_skb(skb); | 5977 | dev_kfree_skb(skb); |
5978 | err_update_stats: | ||
5970 | dev->stats.tx_dropped++; | 5979 | dev->stats.tx_dropped++; |
5971 | return NETDEV_TX_OK; | 5980 | return NETDEV_TX_OK; |
5972 | 5981 | ||
diff --git a/drivers/net/ethernet/sfc/mcdi.c b/drivers/net/ethernet/sfc/mcdi.c index 0095ce95150b..97dd8f18c001 100644 --- a/drivers/net/ethernet/sfc/mcdi.c +++ b/drivers/net/ethernet/sfc/mcdi.c | |||
@@ -667,7 +667,7 @@ fail: | |||
667 | int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address, | 667 | int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address, |
668 | u16 *fw_subtype_list, u32 *capabilities) | 668 | u16 *fw_subtype_list, u32 *capabilities) |
669 | { | 669 | { |
670 | uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMIN]; | 670 | uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMAX]; |
671 | size_t outlen, offset, i; | 671 | size_t outlen, offset, i; |
672 | int port_num = efx_port_num(efx); | 672 | int port_num = efx_port_num(efx); |
673 | int rc; | 673 | int rc; |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 66109a2ad886..f042b0373e5d 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -1471,14 +1471,17 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1471 | if (!tun) | 1471 | if (!tun) |
1472 | return -EBADFD; | 1472 | return -EBADFD; |
1473 | 1473 | ||
1474 | if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) | 1474 | if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) { |
1475 | return -EINVAL; | 1475 | ret = -EINVAL; |
1476 | goto out; | ||
1477 | } | ||
1476 | ret = tun_do_read(tun, tfile, iocb, m->msg_iov, total_len, | 1478 | ret = tun_do_read(tun, tfile, iocb, m->msg_iov, total_len, |
1477 | flags & MSG_DONTWAIT); | 1479 | flags & MSG_DONTWAIT); |
1478 | if (ret > total_len) { | 1480 | if (ret > total_len) { |
1479 | m->msg_flags |= MSG_TRUNC; | 1481 | m->msg_flags |= MSG_TRUNC; |
1480 | ret = flags & MSG_TRUNC ? ret : total_len; | 1482 | ret = flags & MSG_TRUNC ? ret : total_len; |
1481 | } | 1483 | } |
1484 | out: | ||
1482 | tun_put(tun); | 1485 | tun_put(tun); |
1483 | return ret; | 1486 | return ret; |
1484 | } | 1487 | } |
@@ -1593,8 +1596,12 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
1593 | return err; | 1596 | return err; |
1594 | 1597 | ||
1595 | if (tun->flags & TUN_TAP_MQ && | 1598 | if (tun->flags & TUN_TAP_MQ && |
1596 | (tun->numqueues + tun->numdisabled > 1)) | 1599 | (tun->numqueues + tun->numdisabled > 1)) { |
1597 | return -EBUSY; | 1600 | /* One or more queue has already been attached, no need |
1601 | * to initialize the device again. | ||
1602 | */ | ||
1603 | return 0; | ||
1604 | } | ||
1598 | } | 1605 | } |
1599 | else { | 1606 | else { |
1600 | char *name; | 1607 | char *name; |