提交 d317aa58 编写于 作者: D David S. Miller

Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue

Jeff Kirsher says:

====================
100GbE Intel Wired LAN Driver Updates 2015-12-22

This series contains updates to fm10k only.

Bruce cleans up the initialization of fm10k_workqueue at the global level,
which fixes a checkpatch.pl error.  Made several other cleanups of the
driver, like making structures that do not change constant, remove unused
code, cleanup code comments and use boolean states true/false instead of
an integer since a bool is all that is needed.

Jacob fixed the TLV format for little endian structures which are 4 byte
aligned copy, so add an additional __aligned(4) and __packed to ensure
that these structures are actually 4 byte aligned and packed correctly.
Updated the driver to use ether_addr_equal() instead of memcmp() to
compare MAC addresses.

Alex Duyck cleans up the exception handling so all of the paths result in
a similar state if we fail.  Specifically the driver will now unload the
mailbox interrupt, free the queue vectors and MSI-X, and then detach the
interface.
====================
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
...@@ -42,7 +42,7 @@ MODULE_LICENSE("GPL"); ...@@ -42,7 +42,7 @@ MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
/* single workqueue for entire fm10k driver */ /* single workqueue for entire fm10k driver */
struct workqueue_struct *fm10k_workqueue = NULL; struct workqueue_struct *fm10k_workqueue;
/** /**
* fm10k_init_module - Driver Registration Routine * fm10k_init_module - Driver Registration Routine
...@@ -56,8 +56,7 @@ static int __init fm10k_init_module(void) ...@@ -56,8 +56,7 @@ static int __init fm10k_init_module(void)
pr_info("%s\n", fm10k_copyright); pr_info("%s\n", fm10k_copyright);
/* create driver workqueue */ /* create driver workqueue */
if (!fm10k_workqueue) fm10k_workqueue = create_workqueue("fm10k");
fm10k_workqueue = create_workqueue("fm10k");
fm10k_dbg_init(); fm10k_dbg_init();
...@@ -80,7 +79,6 @@ static void __exit fm10k_exit_module(void) ...@@ -80,7 +79,6 @@ static void __exit fm10k_exit_module(void)
/* destroy driver workqueue */ /* destroy driver workqueue */
flush_workqueue(fm10k_workqueue); flush_workqueue(fm10k_workqueue);
destroy_workqueue(fm10k_workqueue); destroy_workqueue(fm10k_workqueue);
fm10k_workqueue = NULL;
} }
module_exit(fm10k_exit_module); module_exit(fm10k_exit_module);
......
...@@ -57,7 +57,7 @@ static u16 fm10k_fifo_unused(struct fm10k_mbx_fifo *fifo) ...@@ -57,7 +57,7 @@ static u16 fm10k_fifo_unused(struct fm10k_mbx_fifo *fifo)
} }
/** /**
* fm10k_fifo_empty - Test to verify if fifo is empty * fm10k_fifo_empty - Test to verify if FIFO is empty
* @fifo: pointer to FIFO * @fifo: pointer to FIFO
* *
* This function returns true if the FIFO is empty, else false * This function returns true if the FIFO is empty, else false
...@@ -72,7 +72,7 @@ static bool fm10k_fifo_empty(struct fm10k_mbx_fifo *fifo) ...@@ -72,7 +72,7 @@ static bool fm10k_fifo_empty(struct fm10k_mbx_fifo *fifo)
* @fifo: pointer to FIFO * @fifo: pointer to FIFO
* @offset: offset to add to head * @offset: offset to add to head
* *
* This function returns the indices into the fifo based on head + offset * This function returns the indices into the FIFO based on head + offset
**/ **/
static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset) static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset)
{ {
...@@ -84,7 +84,7 @@ static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset) ...@@ -84,7 +84,7 @@ static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset)
* @fifo: pointer to FIFO * @fifo: pointer to FIFO
* @offset: offset to add to tail * @offset: offset to add to tail
* *
* This function returns the indices into the fifo based on tail + offset * This function returns the indices into the FIFO based on tail + offset
**/ **/
static u16 fm10k_fifo_tail_offset(struct fm10k_mbx_fifo *fifo, u16 offset) static u16 fm10k_fifo_tail_offset(struct fm10k_mbx_fifo *fifo, u16 offset)
{ {
...@@ -160,7 +160,7 @@ static u16 fm10k_mbx_index_len(struct fm10k_mbx_info *mbx, u16 head, u16 tail) ...@@ -160,7 +160,7 @@ static u16 fm10k_mbx_index_len(struct fm10k_mbx_info *mbx, u16 head, u16 tail)
/** /**
* fm10k_mbx_tail_add - Determine new tail value with added offset * fm10k_mbx_tail_add - Determine new tail value with added offset
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @offset: length to add to head offset * @offset: length to add to tail offset
* *
* This function takes the local tail index and recomputes it for * This function takes the local tail index and recomputes it for
* a given length added as an offset. * a given length added as an offset.
...@@ -176,7 +176,7 @@ static u16 fm10k_mbx_tail_add(struct fm10k_mbx_info *mbx, u16 offset) ...@@ -176,7 +176,7 @@ static u16 fm10k_mbx_tail_add(struct fm10k_mbx_info *mbx, u16 offset)
/** /**
* fm10k_mbx_tail_sub - Determine new tail value with subtracted offset * fm10k_mbx_tail_sub - Determine new tail value with subtracted offset
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @offset: length to add to head offset * @offset: length to add to tail offset
* *
* This function takes the local tail index and recomputes it for * This function takes the local tail index and recomputes it for
* a given length added as an offset. * a given length added as an offset.
...@@ -240,7 +240,7 @@ static u16 fm10k_mbx_pushed_tail_len(struct fm10k_mbx_info *mbx) ...@@ -240,7 +240,7 @@ static u16 fm10k_mbx_pushed_tail_len(struct fm10k_mbx_info *mbx)
} }
/** /**
* fm10k_fifo_write_copy - pulls data off of msg and places it in fifo * fm10k_fifo_write_copy - pulls data off of msg and places it in FIFO
* @fifo: pointer to FIFO * @fifo: pointer to FIFO
* @msg: message array to populate * @msg: message array to populate
* @tail_offset: additional offset to add to tail pointer * @tail_offset: additional offset to add to tail pointer
...@@ -336,6 +336,7 @@ static u16 fm10k_mbx_validate_msg_size(struct fm10k_mbx_info *mbx, u16 len) ...@@ -336,6 +336,7 @@ static u16 fm10k_mbx_validate_msg_size(struct fm10k_mbx_info *mbx, u16 len)
/** /**
* fm10k_mbx_write_copy - pulls data off of Tx FIFO and places it in mbmem * fm10k_mbx_write_copy - pulls data off of Tx FIFO and places it in mbmem
* @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
* This function will take a section of the Tx FIFO and copy it into the * This function will take a section of the Tx FIFO and copy it into the
...@@ -711,7 +712,7 @@ static bool fm10k_mbx_tx_complete(struct fm10k_mbx_info *mbx) ...@@ -711,7 +712,7 @@ static bool fm10k_mbx_tx_complete(struct fm10k_mbx_info *mbx)
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
* This function dequeues messages and hands them off to the tlv parser. * This function dequeues messages and hands them off to the TLV parser.
* It will return the number of messages processed when called. * It will return the number of messages processed when called.
**/ **/
static u16 fm10k_mbx_dequeue_rx(struct fm10k_hw *hw, static u16 fm10k_mbx_dequeue_rx(struct fm10k_hw *hw,
...@@ -924,7 +925,7 @@ static void fm10k_mbx_create_fake_disconnect_hdr(struct fm10k_mbx_info *mbx) ...@@ -924,7 +925,7 @@ static void fm10k_mbx_create_fake_disconnect_hdr(struct fm10k_mbx_info *mbx)
} }
/** /**
* fm10k_mbx_create_error_msg - Generate a error message * fm10k_mbx_create_error_msg - Generate an error message
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @err: local error encountered * @err: local error encountered
* *
...@@ -957,7 +958,6 @@ static void fm10k_mbx_create_error_msg(struct fm10k_mbx_info *mbx, s32 err) ...@@ -957,7 +958,6 @@ static void fm10k_mbx_create_error_msg(struct fm10k_mbx_info *mbx, s32 err)
/** /**
* fm10k_mbx_validate_msg_hdr - Validate common fields in the message header * fm10k_mbx_validate_msg_hdr - Validate common fields in the message header
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @msg: message array to read
* *
* This function will parse up the fields in the mailbox header and return * This function will parse up the fields in the mailbox header and return
* an error if the header contains any of a number of invalid configurations * an error if the header contains any of a number of invalid configurations
...@@ -1021,11 +1021,12 @@ static s32 fm10k_mbx_validate_msg_hdr(struct fm10k_mbx_info *mbx) ...@@ -1021,11 +1021,12 @@ static s32 fm10k_mbx_validate_msg_hdr(struct fm10k_mbx_info *mbx)
/** /**
* fm10k_mbx_create_reply - Generate reply based on state and remote head * fm10k_mbx_create_reply - Generate reply based on state and remote head
* @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @head: acknowledgement number * @head: acknowledgement number
* *
* This function will generate an outgoing message based on the current * This function will generate an outgoing message based on the current
* mailbox state and the remote fifo head. It will return the length * mailbox state and the remote FIFO head. It will return the length
* of the outgoing message excluding header on success, and a negative value * of the outgoing message excluding header on success, and a negative value
* on error. * on error.
**/ **/
...@@ -1151,8 +1152,8 @@ static void fm10k_mbx_connect_reset(struct fm10k_mbx_info *mbx) ...@@ -1151,8 +1152,8 @@ static void fm10k_mbx_connect_reset(struct fm10k_mbx_info *mbx)
/** /**
* fm10k_mbx_process_connect - Process connect header * fm10k_mbx_process_connect - Process connect header
* @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @msg: message array to process
* *
* This function will read an incoming connect header and reply with the * This function will read an incoming connect header and reply with the
* appropriate message. It will return a value indicating the number of * appropriate message. It will return a value indicating the number of
...@@ -1198,6 +1199,7 @@ static s32 fm10k_mbx_process_connect(struct fm10k_hw *hw, ...@@ -1198,6 +1199,7 @@ static s32 fm10k_mbx_process_connect(struct fm10k_hw *hw,
/** /**
* fm10k_mbx_process_data - Process data header * fm10k_mbx_process_data - Process data header
* @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
* This function will read an incoming data header and reply with the * This function will read an incoming data header and reply with the
...@@ -1239,6 +1241,7 @@ static s32 fm10k_mbx_process_data(struct fm10k_hw *hw, ...@@ -1239,6 +1241,7 @@ static s32 fm10k_mbx_process_data(struct fm10k_hw *hw,
/** /**
* fm10k_mbx_process_disconnect - Process disconnect header * fm10k_mbx_process_disconnect - Process disconnect header
* @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
* This function will read an incoming disconnect header and reply with the * This function will read an incoming disconnect header and reply with the
...@@ -1291,6 +1294,7 @@ static s32 fm10k_mbx_process_disconnect(struct fm10k_hw *hw, ...@@ -1291,6 +1294,7 @@ static s32 fm10k_mbx_process_disconnect(struct fm10k_hw *hw,
/** /**
* fm10k_mbx_process_error - Process error header * fm10k_mbx_process_error - Process error header
* @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
* This function will read an incoming error header and reply with the * This function will read an incoming error header and reply with the
...@@ -1560,7 +1564,7 @@ static s32 fm10k_mbx_register_handlers(struct fm10k_mbx_info *mbx, ...@@ -1560,7 +1564,7 @@ static s32 fm10k_mbx_register_handlers(struct fm10k_mbx_info *mbx,
* @id: ID reference for PF as it supports up to 64 PF/VF mailboxes * @id: ID reference for PF as it supports up to 64 PF/VF mailboxes
* *
* This function initializes the mailbox for use. It will split the * This function initializes the mailbox for use. It will split the
* buffer provided an use that th populate both the Tx and Rx FIFO by * buffer provided and use that to populate both the Tx and Rx FIFO by
* evenly splitting it. In order to allow for easy masking of head/tail * evenly splitting it. In order to allow for easy masking of head/tail
* the value reported in size must be a power of 2 and is reported in * the value reported in size must be a power of 2 and is reported in
* DWORDs, not bytes. Any invalid values will cause the mailbox to return * DWORDs, not bytes. Any invalid values will cause the mailbox to return
...@@ -1637,7 +1641,7 @@ s32 fm10k_pfvf_mbx_init(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx, ...@@ -1637,7 +1641,7 @@ s32 fm10k_pfvf_mbx_init(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx,
* fm10k_sm_mbx_create_data_hdr - Generate a mailbox header for local FIFO * fm10k_sm_mbx_create_data_hdr - Generate a mailbox header for local FIFO
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
* This function returns a connection mailbox header * This function returns a data mailbox header
**/ **/
static void fm10k_sm_mbx_create_data_hdr(struct fm10k_mbx_info *mbx) static void fm10k_sm_mbx_create_data_hdr(struct fm10k_mbx_info *mbx)
{ {
...@@ -1730,8 +1734,6 @@ static s32 fm10k_sm_mbx_connect(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx) ...@@ -1730,8 +1734,6 @@ static s32 fm10k_sm_mbx_connect(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx)
fm10k_sm_mbx_create_connect_hdr(mbx, 0); fm10k_sm_mbx_create_connect_hdr(mbx, 0);
fm10k_mbx_write(hw, mbx); fm10k_mbx_write(hw, mbx);
/* enable interrupt and notify other party of new message */
return 0; return 0;
} }
...@@ -1775,7 +1777,7 @@ static void fm10k_sm_mbx_disconnect(struct fm10k_hw *hw, ...@@ -1775,7 +1777,7 @@ static void fm10k_sm_mbx_disconnect(struct fm10k_hw *hw,
} }
/** /**
* fm10k_mbx_validate_fifo_hdr - Validate fields in the remote FIFO header * fm10k_sm_mbx_validate_fifo_hdr - Validate fields in the remote FIFO header
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
* This function will parse up the fields in the mailbox header and return * This function will parse up the fields in the mailbox header and return
...@@ -1853,7 +1855,7 @@ static void fm10k_sm_mbx_process_error(struct fm10k_mbx_info *mbx) ...@@ -1853,7 +1855,7 @@ static void fm10k_sm_mbx_process_error(struct fm10k_mbx_info *mbx)
} }
/** /**
* fm10k_sm_mbx_create_error_message - Process an error in FIFO hdr * fm10k_sm_mbx_create_error_msg - Process an error in FIFO header
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @err: local error encountered * @err: local error encountered
* *
...@@ -1883,6 +1885,7 @@ static void fm10k_sm_mbx_create_error_msg(struct fm10k_mbx_info *mbx, s32 err) ...@@ -1883,6 +1885,7 @@ static void fm10k_sm_mbx_create_error_msg(struct fm10k_mbx_info *mbx, s32 err)
* fm10k_sm_mbx_receive - Take message from Rx mailbox FIFO and put it in Rx * fm10k_sm_mbx_receive - Take message from Rx mailbox FIFO and put it in Rx
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @tail: tail index of message
* *
* This function will dequeue one message from the Rx switch manager mailbox * This function will dequeue one message from the Rx switch manager mailbox
* FIFO and place it in the Rx mailbox FIFO for processing by software. * FIFO and place it in the Rx mailbox FIFO for processing by software.
...@@ -1922,6 +1925,7 @@ static s32 fm10k_sm_mbx_receive(struct fm10k_hw *hw, ...@@ -1922,6 +1925,7 @@ static s32 fm10k_sm_mbx_receive(struct fm10k_hw *hw,
* fm10k_sm_mbx_transmit - Take message from Tx and put it in Tx mailbox FIFO * fm10k_sm_mbx_transmit - Take message from Tx and put it in Tx mailbox FIFO
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @head: head index of message
* *
* This function will dequeue one message from the Tx mailbox FIFO and place * This function will dequeue one message from the Tx mailbox FIFO and place
* it in the Tx switch manager mailbox FIFO for processing by hardware. * it in the Tx switch manager mailbox FIFO for processing by hardware.
...@@ -1961,11 +1965,12 @@ static void fm10k_sm_mbx_transmit(struct fm10k_hw *hw, ...@@ -1961,11 +1965,12 @@ static void fm10k_sm_mbx_transmit(struct fm10k_hw *hw,
/** /**
* fm10k_sm_mbx_create_reply - Generate reply based on state and remote head * fm10k_sm_mbx_create_reply - Generate reply based on state and remote head
* @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @head: acknowledgement number * @head: acknowledgement number
* *
* This function will generate an outgoing message based on the current * This function will generate an outgoing message based on the current
* mailbox state and the remote fifo head. It will return the length * mailbox state and the remote FIFO head. It will return the length
* of the outgoing message excluding header on success, and a negative value * of the outgoing message excluding header on success, and a negative value
* on error. * on error.
**/ **/
...@@ -2077,7 +2082,7 @@ static s32 fm10k_sm_mbx_process_version_1(struct fm10k_hw *hw, ...@@ -2077,7 +2082,7 @@ static s32 fm10k_sm_mbx_process_version_1(struct fm10k_hw *hw,
} }
/** /**
* fm10k_sm_mbx_process - Process mailbox switch mailbox interrupt * fm10k_sm_mbx_process - Process switch manager mailbox interrupt
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* *
...@@ -2133,7 +2138,12 @@ static s32 fm10k_sm_mbx_process(struct fm10k_hw *hw, ...@@ -2133,7 +2138,12 @@ static s32 fm10k_sm_mbx_process(struct fm10k_hw *hw,
* @mbx: pointer to mailbox * @mbx: pointer to mailbox
* @msg_data: handlers for mailbox events * @msg_data: handlers for mailbox events
* *
* This function for now is used to stub out the PF/SM mailbox * This function initializes the PF/SM mailbox for use. It will split the
* buffer provided and use that to populate both the Tx and Rx FIFO by
* evenly splitting it. In order to allow for easy masking of head/tail
* the value reported in size must be a power of 2 and is reported in
* DWORDs, not bytes. Any invalid values will cause the mailbox to return
* error.
**/ **/
s32 fm10k_sm_mbx_init(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx, s32 fm10k_sm_mbx_init(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx,
const struct fm10k_msg_data *msg_data) const struct fm10k_msg_data *msg_data)
......
...@@ -128,11 +128,11 @@ enum fm10k_mbx_state { ...@@ -128,11 +128,11 @@ enum fm10k_mbx_state {
* The maximum message size is provided during connect to avoid * The maximum message size is provided during connect to avoid
* jamming the mailbox with messages that do not fit. * jamming the mailbox with messages that do not fit.
* Err_no: Error number - Applies only to error headers * Err_no: Error number - Applies only to error headers
* The error number provides a indication of the type of error * The error number provides an indication of the type of error
* experienced. * experienced.
*/ */
/* macros for retriving and setting header values */ /* macros for retrieving and setting header values */
#define FM10K_MSG_HDR_MASK(name) \ #define FM10K_MSG_HDR_MASK(name) \
((0x1u << FM10K_MSG_##name##_SIZE) - 1) ((0x1u << FM10K_MSG_##name##_SIZE) - 1)
#define FM10K_MSG_HDR_FIELD_SET(value, name) \ #define FM10K_MSG_HDR_FIELD_SET(value, name) \
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "fm10k.h" #include "fm10k.h"
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#if IS_ENABLED(CONFIG_FM10K_VXLAN) #ifdef CONFIG_FM10K_VXLAN
#include <net/vxlan.h> #include <net/vxlan.h>
#endif /* CONFIG_FM10K_VXLAN */ #endif /* CONFIG_FM10K_VXLAN */
...@@ -556,11 +556,11 @@ int fm10k_open(struct net_device *netdev) ...@@ -556,11 +556,11 @@ int fm10k_open(struct net_device *netdev)
if (err) if (err)
goto err_set_queues; goto err_set_queues;
#if IS_ENABLED(CONFIG_FM10K_VXLAN) #ifdef CONFIG_FM10K_VXLAN
/* update VXLAN port configuration */ /* update VXLAN port configuration */
vxlan_get_rx_port(netdev); vxlan_get_rx_port(netdev);
#endif #endif
fm10k_up(interface); fm10k_up(interface);
return 0; return 0;
...@@ -1153,6 +1153,7 @@ static struct rtnl_link_stats64 *fm10k_get_stats64(struct net_device *netdev, ...@@ -1153,6 +1153,7 @@ static struct rtnl_link_stats64 *fm10k_get_stats64(struct net_device *netdev,
int fm10k_setup_tc(struct net_device *dev, u8 tc) int fm10k_setup_tc(struct net_device *dev, u8 tc)
{ {
struct fm10k_intfc *interface = netdev_priv(dev); struct fm10k_intfc *interface = netdev_priv(dev);
int err;
/* Currently only the PF supports priority classes */ /* Currently only the PF supports priority classes */
if (tc && (interface->hw.mac.type != fm10k_mac_pf)) if (tc && (interface->hw.mac.type != fm10k_mac_pf))
...@@ -1177,17 +1178,30 @@ int fm10k_setup_tc(struct net_device *dev, u8 tc) ...@@ -1177,17 +1178,30 @@ int fm10k_setup_tc(struct net_device *dev, u8 tc)
netdev_reset_tc(dev); netdev_reset_tc(dev);
netdev_set_num_tc(dev, tc); netdev_set_num_tc(dev, tc);
fm10k_init_queueing_scheme(interface); err = fm10k_init_queueing_scheme(interface);
if (err)
goto err_queueing_scheme;
fm10k_mbx_request_irq(interface); err = fm10k_mbx_request_irq(interface);
if (err)
goto err_mbx_irq;
if (netif_running(dev)) err = netif_running(dev) ? fm10k_open(dev) : 0;
fm10k_open(dev); if (err)
goto err_open;
/* flag to indicate SWPRI has yet to be updated */ /* flag to indicate SWPRI has yet to be updated */
interface->flags |= FM10K_FLAG_SWPRI_CONFIG; interface->flags |= FM10K_FLAG_SWPRI_CONFIG;
return 0; return 0;
err_open:
fm10k_mbx_free_irq(interface);
err_mbx_irq:
fm10k_clear_queueing_scheme(interface);
err_queueing_scheme:
netif_device_detach(dev);
return err;
} }
static int fm10k_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) static int fm10k_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
......
...@@ -186,7 +186,13 @@ static void fm10k_reinit(struct fm10k_intfc *interface) ...@@ -186,7 +186,13 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
} }
/* reassociate interrupts */ /* reassociate interrupts */
fm10k_mbx_request_irq(interface); err = fm10k_mbx_request_irq(interface);
if (err)
goto err_mbx_irq;
err = fm10k_hw_ready(interface);
if (err)
goto err_open;
/* update hardware address for VFs if perm_addr has changed */ /* update hardware address for VFs if perm_addr has changed */
if (hw->mac.type == fm10k_mac_vf) { if (hw->mac.type == fm10k_mac_vf) {
...@@ -206,14 +212,23 @@ static void fm10k_reinit(struct fm10k_intfc *interface) ...@@ -206,14 +212,23 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
/* reset clock */ /* reset clock */
fm10k_ts_reset(interface); fm10k_ts_reset(interface);
if (netif_running(netdev)) err = netif_running(netdev) ? fm10k_open(netdev) : 0;
fm10k_open(netdev); if (err)
goto err_open;
fm10k_iov_resume(interface->pdev); fm10k_iov_resume(interface->pdev);
rtnl_unlock();
clear_bit(__FM10K_RESETTING, &interface->state);
return;
err_open:
fm10k_mbx_free_irq(interface);
err_mbx_irq:
fm10k_clear_queueing_scheme(interface);
reinit_err: reinit_err:
if (err) netif_device_detach(netdev);
netif_device_detach(netdev);
rtnl_unlock(); rtnl_unlock();
...@@ -897,7 +912,7 @@ static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data) ...@@ -897,7 +912,7 @@ static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data)
fm10k_mbx_unlock(interface); fm10k_mbx_unlock(interface);
} }
hw->mac.get_host_state = 1; hw->mac.get_host_state = true;
fm10k_service_event_schedule(interface); fm10k_service_event_schedule(interface);
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -1113,7 +1128,7 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data) ...@@ -1113,7 +1128,7 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data)
} }
/* we should validate host state after interrupt event */ /* we should validate host state after interrupt event */
hw->mac.get_host_state = 1; hw->mac.get_host_state = true;
/* validate host state, and handle VF mailboxes in the service task */ /* validate host state, and handle VF mailboxes in the service task */
fm10k_service_event_schedule(interface); fm10k_service_event_schedule(interface);
...@@ -1176,7 +1191,7 @@ static s32 fm10k_mbx_mac_addr(struct fm10k_hw *hw, u32 **results, ...@@ -1176,7 +1191,7 @@ static s32 fm10k_mbx_mac_addr(struct fm10k_hw *hw, u32 **results,
/* MAC was changed so we need reset */ /* MAC was changed so we need reset */
if (is_valid_ether_addr(hw->mac.perm_addr) && if (is_valid_ether_addr(hw->mac.perm_addr) &&
memcmp(hw->mac.perm_addr, hw->mac.addr, ETH_ALEN)) !ether_addr_equal(hw->mac.perm_addr, hw->mac.addr))
interface->flags |= FM10K_FLAG_RESET_REQUESTED; interface->flags |= FM10K_FLAG_RESET_REQUESTED;
/* VLAN override was changed, or default VLAN changed */ /* VLAN override was changed, or default VLAN changed */
...@@ -1620,7 +1635,7 @@ void fm10k_up(struct fm10k_intfc *interface) ...@@ -1620,7 +1635,7 @@ void fm10k_up(struct fm10k_intfc *interface)
netif_tx_start_all_queues(interface->netdev); netif_tx_start_all_queues(interface->netdev);
/* kick off the service timer now */ /* kick off the service timer now */
hw->mac.get_host_state = 1; hw->mac.get_host_state = true;
mod_timer(&interface->service_timer, jiffies); mod_timer(&interface->service_timer, jiffies);
} }
...@@ -2131,16 +2146,22 @@ static int fm10k_resume(struct pci_dev *pdev) ...@@ -2131,16 +2146,22 @@ static int fm10k_resume(struct pci_dev *pdev)
rtnl_lock(); rtnl_lock();
err = fm10k_init_queueing_scheme(interface); err = fm10k_init_queueing_scheme(interface);
if (!err) { if (err)
fm10k_mbx_request_irq(interface); goto err_queueing_scheme;
if (netif_running(netdev))
err = fm10k_open(netdev);
}
rtnl_unlock(); err = fm10k_mbx_request_irq(interface);
if (err)
goto err_mbx_irq;
err = fm10k_hw_ready(interface);
if (err) if (err)
return err; goto err_open;
err = netif_running(netdev) ? fm10k_open(netdev) : 0;
if (err)
goto err_open;
rtnl_unlock();
/* assume host is not ready, to prevent race with watchdog in case we /* assume host is not ready, to prevent race with watchdog in case we
* actually don't have connection to the switch * actually don't have connection to the switch
...@@ -2158,6 +2179,14 @@ static int fm10k_resume(struct pci_dev *pdev) ...@@ -2158,6 +2179,14 @@ static int fm10k_resume(struct pci_dev *pdev)
netif_device_attach(netdev); netif_device_attach(netdev);
return 0; return 0;
err_open:
fm10k_mbx_free_irq(interface);
err_mbx_irq:
fm10k_clear_queueing_scheme(interface);
err_queueing_scheme:
rtnl_unlock();
return err;
} }
/** /**
......
...@@ -1250,7 +1250,7 @@ s32 fm10k_iov_msg_mac_vlan_pf(struct fm10k_hw *hw, u32 **results, ...@@ -1250,7 +1250,7 @@ s32 fm10k_iov_msg_mac_vlan_pf(struct fm10k_hw *hw, u32 **results,
/* block attempts to set MAC for a locked device */ /* block attempts to set MAC for a locked device */
if (is_valid_ether_addr(vf_info->mac) && if (is_valid_ether_addr(vf_info->mac) &&
memcmp(mac, vf_info->mac, ETH_ALEN)) !ether_addr_equal(mac, vf_info->mac))
return FM10K_ERR_PARAM; return FM10K_ERR_PARAM;
set = !(vlan & FM10K_VLAN_CLEAR); set = !(vlan & FM10K_VLAN_CLEAR);
...@@ -1866,39 +1866,39 @@ static const struct fm10k_msg_data fm10k_msg_data_pf[] = { ...@@ -1866,39 +1866,39 @@ static const struct fm10k_msg_data fm10k_msg_data_pf[] = {
FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error), FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
}; };
static struct fm10k_mac_ops mac_ops_pf = { static const struct fm10k_mac_ops mac_ops_pf = {
.get_bus_info = &fm10k_get_bus_info_generic, .get_bus_info = fm10k_get_bus_info_generic,
.reset_hw = &fm10k_reset_hw_pf, .reset_hw = fm10k_reset_hw_pf,
.init_hw = &fm10k_init_hw_pf, .init_hw = fm10k_init_hw_pf,
.start_hw = &fm10k_start_hw_generic, .start_hw = fm10k_start_hw_generic,
.stop_hw = &fm10k_stop_hw_generic, .stop_hw = fm10k_stop_hw_generic,
.update_vlan = &fm10k_update_vlan_pf, .update_vlan = fm10k_update_vlan_pf,
.read_mac_addr = &fm10k_read_mac_addr_pf, .read_mac_addr = fm10k_read_mac_addr_pf,
.update_uc_addr = &fm10k_update_uc_addr_pf, .update_uc_addr = fm10k_update_uc_addr_pf,
.update_mc_addr = &fm10k_update_mc_addr_pf, .update_mc_addr = fm10k_update_mc_addr_pf,
.update_xcast_mode = &fm10k_update_xcast_mode_pf, .update_xcast_mode = fm10k_update_xcast_mode_pf,
.update_int_moderator = &fm10k_update_int_moderator_pf, .update_int_moderator = fm10k_update_int_moderator_pf,
.update_lport_state = &fm10k_update_lport_state_pf, .update_lport_state = fm10k_update_lport_state_pf,
.update_hw_stats = &fm10k_update_hw_stats_pf, .update_hw_stats = fm10k_update_hw_stats_pf,
.rebind_hw_stats = &fm10k_rebind_hw_stats_pf, .rebind_hw_stats = fm10k_rebind_hw_stats_pf,
.configure_dglort_map = &fm10k_configure_dglort_map_pf, .configure_dglort_map = fm10k_configure_dglort_map_pf,
.set_dma_mask = &fm10k_set_dma_mask_pf, .set_dma_mask = fm10k_set_dma_mask_pf,
.get_fault = &fm10k_get_fault_pf, .get_fault = fm10k_get_fault_pf,
.get_host_state = &fm10k_get_host_state_pf, .get_host_state = fm10k_get_host_state_pf,
.adjust_systime = &fm10k_adjust_systime_pf, .adjust_systime = fm10k_adjust_systime_pf,
.read_systime = &fm10k_read_systime_pf, .read_systime = fm10k_read_systime_pf,
}; };
static struct fm10k_iov_ops iov_ops_pf = { static const struct fm10k_iov_ops iov_ops_pf = {
.assign_resources = &fm10k_iov_assign_resources_pf, .assign_resources = fm10k_iov_assign_resources_pf,
.configure_tc = &fm10k_iov_configure_tc_pf, .configure_tc = fm10k_iov_configure_tc_pf,
.assign_int_moderator = &fm10k_iov_assign_int_moderator_pf, .assign_int_moderator = fm10k_iov_assign_int_moderator_pf,
.assign_default_mac_vlan = fm10k_iov_assign_default_mac_vlan_pf, .assign_default_mac_vlan = fm10k_iov_assign_default_mac_vlan_pf,
.reset_resources = &fm10k_iov_reset_resources_pf, .reset_resources = fm10k_iov_reset_resources_pf,
.set_lport = &fm10k_iov_set_lport_pf, .set_lport = fm10k_iov_set_lport_pf,
.reset_lport = &fm10k_iov_reset_lport_pf, .reset_lport = fm10k_iov_reset_lport_pf,
.update_stats = &fm10k_iov_update_stats_pf, .update_stats = fm10k_iov_update_stats_pf,
.report_timestamp = &fm10k_iov_report_timestamp_pf, .report_timestamp = fm10k_iov_report_timestamp_pf,
}; };
static s32 fm10k_get_invariants_pf(struct fm10k_hw *hw) static s32 fm10k_get_invariants_pf(struct fm10k_hw *hw)
...@@ -1908,9 +1908,9 @@ static s32 fm10k_get_invariants_pf(struct fm10k_hw *hw) ...@@ -1908,9 +1908,9 @@ static s32 fm10k_get_invariants_pf(struct fm10k_hw *hw)
return fm10k_sm_mbx_init(hw, &hw->mbx, fm10k_msg_data_pf); return fm10k_sm_mbx_init(hw, &hw->mbx, fm10k_msg_data_pf);
} }
struct fm10k_info fm10k_pf_info = { const struct fm10k_info fm10k_pf_info = {
.mac = fm10k_mac_pf, .mac = fm10k_mac_pf,
.get_invariants = &fm10k_get_invariants_pf, .get_invariants = fm10k_get_invariants_pf,
.mac_ops = &mac_ops_pf, .mac_ops = &mac_ops_pf,
.iov_ops = &iov_ops_pf, .iov_ops = &iov_ops_pf,
}; };
...@@ -74,6 +74,11 @@ enum fm10k_pf_tlv_attr_id_v1 { ...@@ -74,6 +74,11 @@ enum fm10k_pf_tlv_attr_id_v1 {
#define FM10K_MSG_UPDATE_PVID_PVID_SHIFT 16 #define FM10K_MSG_UPDATE_PVID_PVID_SHIFT 16
#define FM10K_MSG_UPDATE_PVID_PVID_SIZE 16 #define FM10K_MSG_UPDATE_PVID_PVID_SIZE 16
/* The following data structures are overlayed directly onto TLV mailbox
* messages, and must not break 4 byte alignment. Ensure the structures line
* up correctly as per their TLV definition.
*/
struct fm10k_mac_update { struct fm10k_mac_update {
__le32 mac_lower; __le32 mac_lower;
__le16 mac_upper; __le16 mac_upper;
...@@ -81,26 +86,26 @@ struct fm10k_mac_update { ...@@ -81,26 +86,26 @@ struct fm10k_mac_update {
__le16 glort; __le16 glort;
u8 flags; u8 flags;
u8 action; u8 action;
} __packed; } __aligned(4) __packed;
struct fm10k_global_table_data { struct fm10k_global_table_data {
__le32 used; __le32 used;
__le32 avail; __le32 avail;
} __packed; } __aligned(4) __packed;
struct fm10k_swapi_error { struct fm10k_swapi_error {
__le32 status; __le32 status;
struct fm10k_global_table_data mac; struct fm10k_global_table_data mac;
struct fm10k_global_table_data nexthop; struct fm10k_global_table_data nexthop;
struct fm10k_global_table_data ffu; struct fm10k_global_table_data ffu;
} __packed; } __aligned(4) __packed;
struct fm10k_swapi_1588_timestamp { struct fm10k_swapi_1588_timestamp {
__le64 egress; __le64 egress;
__le64 ingress; __le64 ingress;
__le16 dglort; __le16 dglort;
__le16 sglort; __le16 sglort;
} __packed; } __aligned(4) __packed;
s32 fm10k_msg_lport_map_pf(struct fm10k_hw *, u32 **, struct fm10k_mbx_info *); s32 fm10k_msg_lport_map_pf(struct fm10k_hw *, u32 **, struct fm10k_mbx_info *);
extern const struct fm10k_tlv_attr fm10k_lport_map_msg_attr[]; extern const struct fm10k_tlv_attr fm10k_lport_map_msg_attr[];
...@@ -128,5 +133,5 @@ s32 fm10k_iov_msg_mac_vlan_pf(struct fm10k_hw *, u32 **, ...@@ -128,5 +133,5 @@ s32 fm10k_iov_msg_mac_vlan_pf(struct fm10k_hw *, u32 **,
s32 fm10k_iov_msg_lport_state_pf(struct fm10k_hw *, u32 **, s32 fm10k_iov_msg_lport_state_pf(struct fm10k_hw *, u32 **,
struct fm10k_mbx_info *); struct fm10k_mbx_info *);
extern struct fm10k_info fm10k_pf_info; extern const struct fm10k_info fm10k_pf_info;
#endif /* _FM10K_PF_H */ #endif /* _FM10K_PF_H */
...@@ -755,7 +755,7 @@ s32 fm10k_tlv_msg_test(struct fm10k_hw *hw, u32 **results, ...@@ -755,7 +755,7 @@ s32 fm10k_tlv_msg_test(struct fm10k_hw *hw, u32 **results,
err = fm10k_tlv_attr_get_mac_vlan( err = fm10k_tlv_attr_get_mac_vlan(
results[FM10K_TEST_MSG_MAC_ADDR], results[FM10K_TEST_MSG_MAC_ADDR],
result_mac, &result_vlan); result_mac, &result_vlan);
if (!err && memcmp(test_mac, result_mac, ETH_ALEN)) if (!err && !ether_addr_equal(test_mac, result_mac))
err = FM10K_ERR_INVALID_VALUE; err = FM10K_ERR_INVALID_VALUE;
if (!err && test_vlan != result_vlan) if (!err && test_vlan != result_vlan)
err = FM10K_ERR_INVALID_VALUE; err = FM10K_ERR_INVALID_VALUE;
......
...@@ -38,9 +38,9 @@ struct fm10k_msg_data; ...@@ -38,9 +38,9 @@ struct fm10k_msg_data;
* mailbox size we will provide a message with the above header and it * mailbox size we will provide a message with the above header and it
* will be segmented and transported to the mailbox to the other side where * will be segmented and transported to the mailbox to the other side where
* it is reassembled. It contains the following fields: * it is reassembled. It contains the following fields:
* Len: Length of the message in bytes excluding the message header * Length: Length of the message in bytes excluding the message header
* Flags: TBD * Flags: TBD
* Rule: These will be the message/argument types we pass * Type/ID: These will be the message/argument types we pass
*/ */
/* message data header */ /* message data header */
#define FM10K_TLV_ID_SHIFT 0 #define FM10K_TLV_ID_SHIFT 0
......
...@@ -550,7 +550,6 @@ struct fm10k_mac_ops { ...@@ -550,7 +550,6 @@ struct fm10k_mac_ops {
struct fm10k_dglort_cfg *); struct fm10k_dglort_cfg *);
void (*set_dma_mask)(struct fm10k_hw *, u64); void (*set_dma_mask)(struct fm10k_hw *, u64);
s32 (*get_fault)(struct fm10k_hw *, int, struct fm10k_fault *); s32 (*get_fault)(struct fm10k_hw *, int, struct fm10k_fault *);
void (*request_lport_map)(struct fm10k_hw *);
s32 (*adjust_systime)(struct fm10k_hw *, s32 ppb); s32 (*adjust_systime)(struct fm10k_hw *, s32 ppb);
u64 (*read_systime)(struct fm10k_hw *); u64 (*read_systime)(struct fm10k_hw *);
}; };
...@@ -660,10 +659,10 @@ enum fm10k_devices { ...@@ -660,10 +659,10 @@ enum fm10k_devices {
}; };
struct fm10k_info { struct fm10k_info {
enum fm10k_mac_type mac; enum fm10k_mac_type mac;
s32 (*get_invariants)(struct fm10k_hw *); s32 (*get_invariants)(struct fm10k_hw *);
struct fm10k_mac_ops *mac_ops; const struct fm10k_mac_ops *mac_ops;
struct fm10k_iov_ops *iov_ops; const struct fm10k_iov_ops *iov_ops;
}; };
struct fm10k_hw { struct fm10k_hw {
......
...@@ -298,7 +298,7 @@ static s32 fm10k_update_uc_addr_vf(struct fm10k_hw *hw, u16 glort, ...@@ -298,7 +298,7 @@ static s32 fm10k_update_uc_addr_vf(struct fm10k_hw *hw, u16 glort,
/* verify we are not locked down on the MAC address */ /* verify we are not locked down on the MAC address */
if (is_valid_ether_addr(hw->mac.perm_addr) && if (is_valid_ether_addr(hw->mac.perm_addr) &&
memcmp(hw->mac.perm_addr, mac, ETH_ALEN)) !ether_addr_equal(hw->mac.perm_addr, mac))
return FM10K_ERR_PARAM; return FM10K_ERR_PARAM;
/* add bit to notify us if this is a set or clear operation */ /* add bit to notify us if this is a set or clear operation */
...@@ -562,25 +562,25 @@ static const struct fm10k_msg_data fm10k_msg_data_vf[] = { ...@@ -562,25 +562,25 @@ static const struct fm10k_msg_data fm10k_msg_data_vf[] = {
FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error), FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
}; };
static struct fm10k_mac_ops mac_ops_vf = { static const struct fm10k_mac_ops mac_ops_vf = {
.get_bus_info = &fm10k_get_bus_info_generic, .get_bus_info = fm10k_get_bus_info_generic,
.reset_hw = &fm10k_reset_hw_vf, .reset_hw = fm10k_reset_hw_vf,
.init_hw = &fm10k_init_hw_vf, .init_hw = fm10k_init_hw_vf,
.start_hw = &fm10k_start_hw_generic, .start_hw = fm10k_start_hw_generic,
.stop_hw = &fm10k_stop_hw_vf, .stop_hw = fm10k_stop_hw_vf,
.update_vlan = &fm10k_update_vlan_vf, .update_vlan = fm10k_update_vlan_vf,
.read_mac_addr = &fm10k_read_mac_addr_vf, .read_mac_addr = fm10k_read_mac_addr_vf,
.update_uc_addr = &fm10k_update_uc_addr_vf, .update_uc_addr = fm10k_update_uc_addr_vf,
.update_mc_addr = &fm10k_update_mc_addr_vf, .update_mc_addr = fm10k_update_mc_addr_vf,
.update_xcast_mode = &fm10k_update_xcast_mode_vf, .update_xcast_mode = fm10k_update_xcast_mode_vf,
.update_int_moderator = &fm10k_update_int_moderator_vf, .update_int_moderator = fm10k_update_int_moderator_vf,
.update_lport_state = &fm10k_update_lport_state_vf, .update_lport_state = fm10k_update_lport_state_vf,
.update_hw_stats = &fm10k_update_hw_stats_vf, .update_hw_stats = fm10k_update_hw_stats_vf,
.rebind_hw_stats = &fm10k_rebind_hw_stats_vf, .rebind_hw_stats = fm10k_rebind_hw_stats_vf,
.configure_dglort_map = &fm10k_configure_dglort_map_vf, .configure_dglort_map = fm10k_configure_dglort_map_vf,
.get_host_state = &fm10k_get_host_state_generic, .get_host_state = fm10k_get_host_state_generic,
.adjust_systime = &fm10k_adjust_systime_vf, .adjust_systime = fm10k_adjust_systime_vf,
.read_systime = &fm10k_read_systime_vf, .read_systime = fm10k_read_systime_vf,
}; };
static s32 fm10k_get_invariants_vf(struct fm10k_hw *hw) static s32 fm10k_get_invariants_vf(struct fm10k_hw *hw)
...@@ -590,8 +590,8 @@ static s32 fm10k_get_invariants_vf(struct fm10k_hw *hw) ...@@ -590,8 +590,8 @@ static s32 fm10k_get_invariants_vf(struct fm10k_hw *hw)
return fm10k_pfvf_mbx_init(hw, &hw->mbx, fm10k_msg_data_vf, 0); return fm10k_pfvf_mbx_init(hw, &hw->mbx, fm10k_msg_data_vf, 0);
} }
struct fm10k_info fm10k_vf_info = { const struct fm10k_info fm10k_vf_info = {
.mac = fm10k_mac_vf, .mac = fm10k_mac_vf,
.get_invariants = &fm10k_get_invariants_vf, .get_invariants = fm10k_get_invariants_vf,
.mac_ops = &mac_ops_vf, .mac_ops = &mac_ops_vf,
}; };
...@@ -74,5 +74,5 @@ extern const struct fm10k_tlv_attr fm10k_1588_msg_attr[]; ...@@ -74,5 +74,5 @@ extern const struct fm10k_tlv_attr fm10k_1588_msg_attr[];
#define FM10K_VF_MSG_1588_HANDLER(func) \ #define FM10K_VF_MSG_1588_HANDLER(func) \
FM10K_MSG_HANDLER(FM10K_VF_MSG_ID_1588, fm10k_1588_msg_attr, func) FM10K_MSG_HANDLER(FM10K_VF_MSG_ID_1588, fm10k_1588_msg_attr, func)
extern struct fm10k_info fm10k_vf_info; extern const struct fm10k_info fm10k_vf_info;
#endif /* _FM10K_VF_H */ #endif /* _FM10K_VF_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册