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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
d317aa5893
@ -42,7 +42,7 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
|
||||
/* single workqueue for entire fm10k driver */
|
||||
struct workqueue_struct *fm10k_workqueue = NULL;
|
||||
struct workqueue_struct *fm10k_workqueue;
|
||||
|
||||
/**
|
||||
* fm10k_init_module - Driver Registration Routine
|
||||
@ -56,8 +56,7 @@ static int __init fm10k_init_module(void)
|
||||
pr_info("%s\n", fm10k_copyright);
|
||||
|
||||
/* create driver workqueue */
|
||||
if (!fm10k_workqueue)
|
||||
fm10k_workqueue = create_workqueue("fm10k");
|
||||
fm10k_workqueue = create_workqueue("fm10k");
|
||||
|
||||
fm10k_dbg_init();
|
||||
|
||||
@ -80,7 +79,6 @@ static void __exit fm10k_exit_module(void)
|
||||
/* destroy driver workqueue */
|
||||
flush_workqueue(fm10k_workqueue);
|
||||
destroy_workqueue(fm10k_workqueue);
|
||||
fm10k_workqueue = NULL;
|
||||
}
|
||||
module_exit(fm10k_exit_module);
|
||||
|
||||
|
@ -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
|
||||
*
|
||||
* 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)
|
||||
* @fifo: pointer to FIFO
|
||||
* @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)
|
||||
{
|
||||
@ -84,7 +84,7 @@ static u16 fm10k_fifo_head_offset(struct fm10k_mbx_fifo *fifo, u16 offset)
|
||||
* @fifo: pointer to FIFO
|
||||
* @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)
|
||||
{
|
||||
@ -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
|
||||
* @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
|
||||
* a given length added as an 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
|
||||
* @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
|
||||
* a given length added as an offset.
|
||||
@ -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
|
||||
* @msg: message array to populate
|
||||
* @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)
|
||||
|
||||
/**
|
||||
* fm10k_mbx_write_copy - pulls data off of Tx FIFO and places it in mbmem
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
*
|
||||
* 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)
|
||||
* @hw: pointer to hardware structure
|
||||
* @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.
|
||||
**/
|
||||
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)
|
||||
}
|
||||
|
||||
/**
|
||||
* fm10k_mbx_create_error_msg - Generate a error message
|
||||
* fm10k_mbx_create_error_msg - Generate an error message
|
||||
* @mbx: pointer to mailbox
|
||||
* @err: local error encountered
|
||||
*
|
||||
@ -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
|
||||
* @mbx: pointer to mailbox
|
||||
* @msg: message array to read
|
||||
*
|
||||
* 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
|
||||
@ -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
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
* @head: acknowledgement number
|
||||
*
|
||||
* 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
|
||||
* on error.
|
||||
**/
|
||||
@ -1151,8 +1152,8 @@ static void fm10k_mbx_connect_reset(struct fm10k_mbx_info *mbx)
|
||||
|
||||
/**
|
||||
* fm10k_mbx_process_connect - Process connect header
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
* @msg: message array to process
|
||||
*
|
||||
* This function will read an incoming connect header and reply with the
|
||||
* 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,
|
||||
|
||||
/**
|
||||
* fm10k_mbx_process_data - Process data header
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
*
|
||||
* 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,
|
||||
|
||||
/**
|
||||
* fm10k_mbx_process_disconnect - Process disconnect header
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
*
|
||||
* 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,
|
||||
|
||||
/**
|
||||
* fm10k_mbx_process_error - Process error header
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
*
|
||||
* 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,
|
||||
* @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
|
||||
* 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
|
||||
* 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
|
||||
@ -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
|
||||
* @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)
|
||||
{
|
||||
@ -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_mbx_write(hw, mbx);
|
||||
|
||||
/* enable interrupt and notify other party of new message */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -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
|
||||
*
|
||||
* 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)
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @err: local error encountered
|
||||
*
|
||||
@ -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
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
* @tail: tail index of message
|
||||
*
|
||||
* 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.
|
||||
@ -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
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
* @head: head index of message
|
||||
*
|
||||
* 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.
|
||||
@ -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
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
* @head: acknowledgement number
|
||||
*
|
||||
* 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
|
||||
* on error.
|
||||
**/
|
||||
@ -2077,7 +2082,7 @@ send_reply:
|
||||
}
|
||||
|
||||
/**
|
||||
* fm10k_sm_mbx_process - Process mailbox switch mailbox interrupt
|
||||
* fm10k_sm_mbx_process - Process switch manager mailbox interrupt
|
||||
* @hw: pointer to hardware structure
|
||||
* @mbx: pointer to mailbox
|
||||
*
|
||||
@ -2133,7 +2138,12 @@ fifo_err:
|
||||
* @mbx: pointer to mailbox
|
||||
* @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,
|
||||
const struct fm10k_msg_data *msg_data)
|
||||
|
@ -128,11 +128,11 @@ enum fm10k_mbx_state {
|
||||
* The maximum message size is provided during connect to avoid
|
||||
* jamming the mailbox with messages that do not fit.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* macros for retriving and setting header values */
|
||||
/* macros for retrieving and setting header values */
|
||||
#define FM10K_MSG_HDR_MASK(name) \
|
||||
((0x1u << FM10K_MSG_##name##_SIZE) - 1)
|
||||
#define FM10K_MSG_HDR_FIELD_SET(value, name) \
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#include "fm10k.h"
|
||||
#include <linux/vmalloc.h>
|
||||
#if IS_ENABLED(CONFIG_FM10K_VXLAN)
|
||||
#ifdef CONFIG_FM10K_VXLAN
|
||||
#include <net/vxlan.h>
|
||||
#endif /* CONFIG_FM10K_VXLAN */
|
||||
|
||||
@ -556,11 +556,11 @@ int fm10k_open(struct net_device *netdev)
|
||||
if (err)
|
||||
goto err_set_queues;
|
||||
|
||||
#if IS_ENABLED(CONFIG_FM10K_VXLAN)
|
||||
#ifdef CONFIG_FM10K_VXLAN
|
||||
/* update VXLAN port configuration */
|
||||
vxlan_get_rx_port(netdev);
|
||||
|
||||
#endif
|
||||
|
||||
fm10k_up(interface);
|
||||
|
||||
return 0;
|
||||
@ -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)
|
||||
{
|
||||
struct fm10k_intfc *interface = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
/* Currently only the PF supports priority classes */
|
||||
if (tc && (interface->hw.mac.type != fm10k_mac_pf))
|
||||
@ -1177,17 +1178,30 @@ int fm10k_setup_tc(struct net_device *dev, u8 tc)
|
||||
netdev_reset_tc(dev);
|
||||
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))
|
||||
fm10k_open(dev);
|
||||
err = netif_running(dev) ? fm10k_open(dev) : 0;
|
||||
if (err)
|
||||
goto err_open;
|
||||
|
||||
/* flag to indicate SWPRI has yet to be updated */
|
||||
interface->flags |= FM10K_FLAG_SWPRI_CONFIG;
|
||||
|
||||
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)
|
||||
|
@ -186,7 +186,13 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
if (hw->mac.type == fm10k_mac_vf) {
|
||||
@ -206,14 +212,23 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
||||
/* reset clock */
|
||||
fm10k_ts_reset(interface);
|
||||
|
||||
if (netif_running(netdev))
|
||||
fm10k_open(netdev);
|
||||
err = netif_running(netdev) ? fm10k_open(netdev) : 0;
|
||||
if (err)
|
||||
goto err_open;
|
||||
|
||||
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:
|
||||
if (err)
|
||||
netif_device_detach(netdev);
|
||||
netif_device_detach(netdev);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
@ -897,7 +912,7 @@ static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data)
|
||||
fm10k_mbx_unlock(interface);
|
||||
}
|
||||
|
||||
hw->mac.get_host_state = 1;
|
||||
hw->mac.get_host_state = true;
|
||||
fm10k_service_event_schedule(interface);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@ -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 */
|
||||
hw->mac.get_host_state = 1;
|
||||
hw->mac.get_host_state = true;
|
||||
|
||||
/* validate host state, and handle VF mailboxes in the service task */
|
||||
fm10k_service_event_schedule(interface);
|
||||
@ -1176,7 +1191,7 @@ static s32 fm10k_mbx_mac_addr(struct fm10k_hw *hw, u32 **results,
|
||||
|
||||
/* MAC was changed so we need reset */
|
||||
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;
|
||||
|
||||
/* VLAN override was changed, or default VLAN changed */
|
||||
@ -1620,7 +1635,7 @@ void fm10k_up(struct fm10k_intfc *interface)
|
||||
netif_tx_start_all_queues(interface->netdev);
|
||||
|
||||
/* kick off the service timer now */
|
||||
hw->mac.get_host_state = 1;
|
||||
hw->mac.get_host_state = true;
|
||||
mod_timer(&interface->service_timer, jiffies);
|
||||
}
|
||||
|
||||
@ -2131,17 +2146,23 @@ static int fm10k_resume(struct pci_dev *pdev)
|
||||
rtnl_lock();
|
||||
|
||||
err = fm10k_init_queueing_scheme(interface);
|
||||
if (!err) {
|
||||
fm10k_mbx_request_irq(interface);
|
||||
if (netif_running(netdev))
|
||||
err = fm10k_open(netdev);
|
||||
}
|
||||
if (err)
|
||||
goto err_queueing_scheme;
|
||||
|
||||
err = fm10k_mbx_request_irq(interface);
|
||||
if (err)
|
||||
goto err_mbx_irq;
|
||||
|
||||
err = fm10k_hw_ready(interface);
|
||||
if (err)
|
||||
goto err_open;
|
||||
|
||||
err = netif_running(netdev) ? fm10k_open(netdev) : 0;
|
||||
if (err)
|
||||
goto err_open;
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* assume host is not ready, to prevent race with watchdog in case we
|
||||
* actually don't have connection to the switch
|
||||
*/
|
||||
@ -2158,6 +2179,14 @@ static int fm10k_resume(struct pci_dev *pdev)
|
||||
netif_device_attach(netdev);
|
||||
|
||||
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,
|
||||
|
||||
/* block attempts to set MAC for a locked device */
|
||||
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;
|
||||
|
||||
set = !(vlan & FM10K_VLAN_CLEAR);
|
||||
@ -1866,39 +1866,39 @@ static const struct fm10k_msg_data fm10k_msg_data_pf[] = {
|
||||
FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
|
||||
};
|
||||
|
||||
static struct fm10k_mac_ops mac_ops_pf = {
|
||||
.get_bus_info = &fm10k_get_bus_info_generic,
|
||||
.reset_hw = &fm10k_reset_hw_pf,
|
||||
.init_hw = &fm10k_init_hw_pf,
|
||||
.start_hw = &fm10k_start_hw_generic,
|
||||
.stop_hw = &fm10k_stop_hw_generic,
|
||||
.update_vlan = &fm10k_update_vlan_pf,
|
||||
.read_mac_addr = &fm10k_read_mac_addr_pf,
|
||||
.update_uc_addr = &fm10k_update_uc_addr_pf,
|
||||
.update_mc_addr = &fm10k_update_mc_addr_pf,
|
||||
.update_xcast_mode = &fm10k_update_xcast_mode_pf,
|
||||
.update_int_moderator = &fm10k_update_int_moderator_pf,
|
||||
.update_lport_state = &fm10k_update_lport_state_pf,
|
||||
.update_hw_stats = &fm10k_update_hw_stats_pf,
|
||||
.rebind_hw_stats = &fm10k_rebind_hw_stats_pf,
|
||||
.configure_dglort_map = &fm10k_configure_dglort_map_pf,
|
||||
.set_dma_mask = &fm10k_set_dma_mask_pf,
|
||||
.get_fault = &fm10k_get_fault_pf,
|
||||
.get_host_state = &fm10k_get_host_state_pf,
|
||||
.adjust_systime = &fm10k_adjust_systime_pf,
|
||||
.read_systime = &fm10k_read_systime_pf,
|
||||
static const struct fm10k_mac_ops mac_ops_pf = {
|
||||
.get_bus_info = fm10k_get_bus_info_generic,
|
||||
.reset_hw = fm10k_reset_hw_pf,
|
||||
.init_hw = fm10k_init_hw_pf,
|
||||
.start_hw = fm10k_start_hw_generic,
|
||||
.stop_hw = fm10k_stop_hw_generic,
|
||||
.update_vlan = fm10k_update_vlan_pf,
|
||||
.read_mac_addr = fm10k_read_mac_addr_pf,
|
||||
.update_uc_addr = fm10k_update_uc_addr_pf,
|
||||
.update_mc_addr = fm10k_update_mc_addr_pf,
|
||||
.update_xcast_mode = fm10k_update_xcast_mode_pf,
|
||||
.update_int_moderator = fm10k_update_int_moderator_pf,
|
||||
.update_lport_state = fm10k_update_lport_state_pf,
|
||||
.update_hw_stats = fm10k_update_hw_stats_pf,
|
||||
.rebind_hw_stats = fm10k_rebind_hw_stats_pf,
|
||||
.configure_dglort_map = fm10k_configure_dglort_map_pf,
|
||||
.set_dma_mask = fm10k_set_dma_mask_pf,
|
||||
.get_fault = fm10k_get_fault_pf,
|
||||
.get_host_state = fm10k_get_host_state_pf,
|
||||
.adjust_systime = fm10k_adjust_systime_pf,
|
||||
.read_systime = fm10k_read_systime_pf,
|
||||
};
|
||||
|
||||
static struct fm10k_iov_ops iov_ops_pf = {
|
||||
.assign_resources = &fm10k_iov_assign_resources_pf,
|
||||
.configure_tc = &fm10k_iov_configure_tc_pf,
|
||||
.assign_int_moderator = &fm10k_iov_assign_int_moderator_pf,
|
||||
static const struct fm10k_iov_ops iov_ops_pf = {
|
||||
.assign_resources = fm10k_iov_assign_resources_pf,
|
||||
.configure_tc = fm10k_iov_configure_tc_pf,
|
||||
.assign_int_moderator = fm10k_iov_assign_int_moderator_pf,
|
||||
.assign_default_mac_vlan = fm10k_iov_assign_default_mac_vlan_pf,
|
||||
.reset_resources = &fm10k_iov_reset_resources_pf,
|
||||
.set_lport = &fm10k_iov_set_lport_pf,
|
||||
.reset_lport = &fm10k_iov_reset_lport_pf,
|
||||
.update_stats = &fm10k_iov_update_stats_pf,
|
||||
.report_timestamp = &fm10k_iov_report_timestamp_pf,
|
||||
.reset_resources = fm10k_iov_reset_resources_pf,
|
||||
.set_lport = fm10k_iov_set_lport_pf,
|
||||
.reset_lport = fm10k_iov_reset_lport_pf,
|
||||
.update_stats = fm10k_iov_update_stats_pf,
|
||||
.report_timestamp = fm10k_iov_report_timestamp_pf,
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
struct fm10k_info fm10k_pf_info = {
|
||||
const struct fm10k_info fm10k_pf_info = {
|
||||
.mac = fm10k_mac_pf,
|
||||
.get_invariants = &fm10k_get_invariants_pf,
|
||||
.get_invariants = fm10k_get_invariants_pf,
|
||||
.mac_ops = &mac_ops_pf,
|
||||
.iov_ops = &iov_ops_pf,
|
||||
};
|
||||
|
@ -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_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 {
|
||||
__le32 mac_lower;
|
||||
__le16 mac_upper;
|
||||
@ -81,26 +86,26 @@ struct fm10k_mac_update {
|
||||
__le16 glort;
|
||||
u8 flags;
|
||||
u8 action;
|
||||
} __packed;
|
||||
} __aligned(4) __packed;
|
||||
|
||||
struct fm10k_global_table_data {
|
||||
__le32 used;
|
||||
__le32 avail;
|
||||
} __packed;
|
||||
} __aligned(4) __packed;
|
||||
|
||||
struct fm10k_swapi_error {
|
||||
__le32 status;
|
||||
struct fm10k_global_table_data mac;
|
||||
struct fm10k_global_table_data nexthop;
|
||||
struct fm10k_global_table_data ffu;
|
||||
} __packed;
|
||||
} __aligned(4) __packed;
|
||||
|
||||
struct fm10k_swapi_1588_timestamp {
|
||||
__le64 egress;
|
||||
__le64 ingress;
|
||||
__le16 dglort;
|
||||
__le16 sglort;
|
||||
} __packed;
|
||||
} __aligned(4) __packed;
|
||||
|
||||
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[];
|
||||
@ -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 **,
|
||||
struct fm10k_mbx_info *);
|
||||
|
||||
extern struct fm10k_info fm10k_pf_info;
|
||||
extern const struct fm10k_info fm10k_pf_info;
|
||||
#endif /* _FM10K_PF_H */
|
||||
|
@ -755,7 +755,7 @@ parse_nested:
|
||||
err = fm10k_tlv_attr_get_mac_vlan(
|
||||
results[FM10K_TEST_MSG_MAC_ADDR],
|
||||
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;
|
||||
if (!err && test_vlan != result_vlan)
|
||||
err = FM10K_ERR_INVALID_VALUE;
|
||||
|
@ -38,9 +38,9 @@ struct fm10k_msg_data;
|
||||
* 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
|
||||
* 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
|
||||
* Rule: These will be the message/argument types we pass
|
||||
* Type/ID: These will be the message/argument types we pass
|
||||
*/
|
||||
/* message data header */
|
||||
#define FM10K_TLV_ID_SHIFT 0
|
||||
|
@ -550,7 +550,6 @@ struct fm10k_mac_ops {
|
||||
struct fm10k_dglort_cfg *);
|
||||
void (*set_dma_mask)(struct fm10k_hw *, u64);
|
||||
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);
|
||||
u64 (*read_systime)(struct fm10k_hw *);
|
||||
};
|
||||
@ -660,10 +659,10 @@ enum fm10k_devices {
|
||||
};
|
||||
|
||||
struct fm10k_info {
|
||||
enum fm10k_mac_type mac;
|
||||
s32 (*get_invariants)(struct fm10k_hw *);
|
||||
struct fm10k_mac_ops *mac_ops;
|
||||
struct fm10k_iov_ops *iov_ops;
|
||||
enum fm10k_mac_type mac;
|
||||
s32 (*get_invariants)(struct fm10k_hw *);
|
||||
const struct fm10k_mac_ops *mac_ops;
|
||||
const struct fm10k_iov_ops *iov_ops;
|
||||
};
|
||||
|
||||
struct fm10k_hw {
|
||||
|
@ -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 */
|
||||
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;
|
||||
|
||||
/* 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[] = {
|
||||
FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
|
||||
};
|
||||
|
||||
static struct fm10k_mac_ops mac_ops_vf = {
|
||||
.get_bus_info = &fm10k_get_bus_info_generic,
|
||||
.reset_hw = &fm10k_reset_hw_vf,
|
||||
.init_hw = &fm10k_init_hw_vf,
|
||||
.start_hw = &fm10k_start_hw_generic,
|
||||
.stop_hw = &fm10k_stop_hw_vf,
|
||||
.update_vlan = &fm10k_update_vlan_vf,
|
||||
.read_mac_addr = &fm10k_read_mac_addr_vf,
|
||||
.update_uc_addr = &fm10k_update_uc_addr_vf,
|
||||
.update_mc_addr = &fm10k_update_mc_addr_vf,
|
||||
.update_xcast_mode = &fm10k_update_xcast_mode_vf,
|
||||
.update_int_moderator = &fm10k_update_int_moderator_vf,
|
||||
.update_lport_state = &fm10k_update_lport_state_vf,
|
||||
.update_hw_stats = &fm10k_update_hw_stats_vf,
|
||||
.rebind_hw_stats = &fm10k_rebind_hw_stats_vf,
|
||||
.configure_dglort_map = &fm10k_configure_dglort_map_vf,
|
||||
.get_host_state = &fm10k_get_host_state_generic,
|
||||
.adjust_systime = &fm10k_adjust_systime_vf,
|
||||
.read_systime = &fm10k_read_systime_vf,
|
||||
static const struct fm10k_mac_ops mac_ops_vf = {
|
||||
.get_bus_info = fm10k_get_bus_info_generic,
|
||||
.reset_hw = fm10k_reset_hw_vf,
|
||||
.init_hw = fm10k_init_hw_vf,
|
||||
.start_hw = fm10k_start_hw_generic,
|
||||
.stop_hw = fm10k_stop_hw_vf,
|
||||
.update_vlan = fm10k_update_vlan_vf,
|
||||
.read_mac_addr = fm10k_read_mac_addr_vf,
|
||||
.update_uc_addr = fm10k_update_uc_addr_vf,
|
||||
.update_mc_addr = fm10k_update_mc_addr_vf,
|
||||
.update_xcast_mode = fm10k_update_xcast_mode_vf,
|
||||
.update_int_moderator = fm10k_update_int_moderator_vf,
|
||||
.update_lport_state = fm10k_update_lport_state_vf,
|
||||
.update_hw_stats = fm10k_update_hw_stats_vf,
|
||||
.rebind_hw_stats = fm10k_rebind_hw_stats_vf,
|
||||
.configure_dglort_map = fm10k_configure_dglort_map_vf,
|
||||
.get_host_state = fm10k_get_host_state_generic,
|
||||
.adjust_systime = fm10k_adjust_systime_vf,
|
||||
.read_systime = fm10k_read_systime_vf,
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
struct fm10k_info fm10k_vf_info = {
|
||||
const struct fm10k_info fm10k_vf_info = {
|
||||
.mac = fm10k_mac_vf,
|
||||
.get_invariants = &fm10k_get_invariants_vf,
|
||||
.get_invariants = fm10k_get_invariants_vf,
|
||||
.mac_ops = &mac_ops_vf,
|
||||
};
|
||||
|
@ -74,5 +74,5 @@ extern const struct fm10k_tlv_attr fm10k_1588_msg_attr[];
|
||||
#define FM10K_VF_MSG_1588_HANDLER(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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user