Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2022-09-08 (ice, iavf) This series contains updates to ice and iavf drivers. Dave removes extra unplug of auxiliary bus on reset which caused a scheduling while atomic to be reported for ice. Ding Hui defers setting of queues for TCs to ensure valid configuration and restores old config if invalid for ice. Sylwester fixes a check of setting MAC address to occur after result is received from PF for iavf driver. Brett changes check of ring tail to use software cached value as not all devices have access to register tail for iavf driver. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
21be1ad637
@ -1077,7 +1077,6 @@ static int iavf_set_mac(struct net_device *netdev, void *p)
|
||||
{
|
||||
struct iavf_adapter *adapter = netdev_priv(netdev);
|
||||
struct sockaddr *addr = p;
|
||||
bool handle_mac = iavf_is_mac_set_handled(netdev, addr->sa_data);
|
||||
int ret;
|
||||
|
||||
if (!is_valid_ether_addr(addr->sa_data))
|
||||
@ -1094,10 +1093,9 @@ static int iavf_set_mac(struct net_device *netdev, void *p)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (handle_mac)
|
||||
goto done;
|
||||
|
||||
ret = wait_event_interruptible_timeout(adapter->vc_waitqueue, false, msecs_to_jiffies(2500));
|
||||
ret = wait_event_interruptible_timeout(adapter->vc_waitqueue,
|
||||
iavf_is_mac_set_handled(netdev, addr->sa_data),
|
||||
msecs_to_jiffies(2500));
|
||||
|
||||
/* If ret < 0 then it means wait was interrupted.
|
||||
* If ret == 0 then it means we got a timeout.
|
||||
@ -1111,7 +1109,6 @@ static int iavf_set_mac(struct net_device *netdev, void *p)
|
||||
if (!ret)
|
||||
return -EAGAIN;
|
||||
|
||||
done:
|
||||
if (!ether_addr_equal(netdev->dev_addr, addr->sa_data))
|
||||
return -EACCES;
|
||||
|
||||
|
@ -114,8 +114,11 @@ u32 iavf_get_tx_pending(struct iavf_ring *ring, bool in_sw)
|
||||
{
|
||||
u32 head, tail;
|
||||
|
||||
/* underlying hardware might not allow access and/or always return
|
||||
* 0 for the head/tail registers so just use the cached values
|
||||
*/
|
||||
head = ring->next_to_clean;
|
||||
tail = readl(ring->tail);
|
||||
tail = ring->next_to_use;
|
||||
|
||||
if (head != tail)
|
||||
return (head < tail) ?
|
||||
|
@ -914,7 +914,7 @@ static void ice_set_dflt_vsi_ctx(struct ice_hw *hw, struct ice_vsi_ctx *ctxt)
|
||||
*/
|
||||
static int ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
|
||||
{
|
||||
u16 offset = 0, qmap = 0, tx_count = 0, pow = 0;
|
||||
u16 offset = 0, qmap = 0, tx_count = 0, rx_count = 0, pow = 0;
|
||||
u16 num_txq_per_tc, num_rxq_per_tc;
|
||||
u16 qcount_tx = vsi->alloc_txq;
|
||||
u16 qcount_rx = vsi->alloc_rxq;
|
||||
@ -981,22 +981,24 @@ static int ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)
|
||||
* at least 1)
|
||||
*/
|
||||
if (offset)
|
||||
vsi->num_rxq = offset;
|
||||
rx_count = offset;
|
||||
else
|
||||
vsi->num_rxq = num_rxq_per_tc;
|
||||
rx_count = num_rxq_per_tc;
|
||||
|
||||
if (vsi->num_rxq > vsi->alloc_rxq) {
|
||||
if (rx_count > vsi->alloc_rxq) {
|
||||
dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Rx queues (%u), than were allocated (%u)!\n",
|
||||
vsi->num_rxq, vsi->alloc_rxq);
|
||||
rx_count, vsi->alloc_rxq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tx_count > vsi->alloc_txq) {
|
||||
dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Tx queues (%u), than were allocated (%u)!\n",
|
||||
tx_count, vsi->alloc_txq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vsi->num_txq = tx_count;
|
||||
if (vsi->num_txq > vsi->alloc_txq) {
|
||||
dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Tx queues (%u), than were allocated (%u)!\n",
|
||||
vsi->num_txq, vsi->alloc_txq);
|
||||
return -EINVAL;
|
||||
}
|
||||
vsi->num_rxq = rx_count;
|
||||
|
||||
if (vsi->type == ICE_VSI_VF && vsi->num_txq != vsi->num_rxq) {
|
||||
dev_dbg(ice_pf_to_dev(vsi->back), "VF VSI should have same number of Tx and Rx queues. Hence making them equal\n");
|
||||
@ -3490,6 +3492,7 @@ ice_vsi_setup_q_map_mqprio(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt,
|
||||
u16 pow, offset = 0, qcount_tx = 0, qcount_rx = 0, qmap;
|
||||
u16 tc0_offset = vsi->mqprio_qopt.qopt.offset[0];
|
||||
int tc0_qcount = vsi->mqprio_qopt.qopt.count[0];
|
||||
u16 new_txq, new_rxq;
|
||||
u8 netdev_tc = 0;
|
||||
int i;
|
||||
|
||||
@ -3530,21 +3533,24 @@ ice_vsi_setup_q_map_mqprio(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt,
|
||||
}
|
||||
}
|
||||
|
||||
/* Set actual Tx/Rx queue pairs */
|
||||
vsi->num_txq = offset + qcount_tx;
|
||||
if (vsi->num_txq > vsi->alloc_txq) {
|
||||
new_txq = offset + qcount_tx;
|
||||
if (new_txq > vsi->alloc_txq) {
|
||||
dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Tx queues (%u), than were allocated (%u)!\n",
|
||||
vsi->num_txq, vsi->alloc_txq);
|
||||
new_txq, vsi->alloc_txq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vsi->num_rxq = offset + qcount_rx;
|
||||
if (vsi->num_rxq > vsi->alloc_rxq) {
|
||||
new_rxq = offset + qcount_rx;
|
||||
if (new_rxq > vsi->alloc_rxq) {
|
||||
dev_err(ice_pf_to_dev(vsi->back), "Trying to use more Rx queues (%u), than were allocated (%u)!\n",
|
||||
vsi->num_rxq, vsi->alloc_rxq);
|
||||
new_rxq, vsi->alloc_rxq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Set actual Tx/Rx queue pairs */
|
||||
vsi->num_txq = new_txq;
|
||||
vsi->num_rxq = new_rxq;
|
||||
|
||||
/* Setup queue TC[0].qmap for given VSI context */
|
||||
ctxt->info.tc_mapping[0] = cpu_to_le16(qmap);
|
||||
ctxt->info.q_mapping[0] = cpu_to_le16(vsi->rxq_map[0]);
|
||||
@ -3576,6 +3582,7 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)
|
||||
{
|
||||
u16 max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 };
|
||||
struct ice_pf *pf = vsi->back;
|
||||
struct ice_tc_cfg old_tc_cfg;
|
||||
struct ice_vsi_ctx *ctx;
|
||||
struct device *dev;
|
||||
int i, ret = 0;
|
||||
@ -3600,6 +3607,7 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)
|
||||
max_txqs[i] = vsi->num_txq;
|
||||
}
|
||||
|
||||
memcpy(&old_tc_cfg, &vsi->tc_cfg, sizeof(old_tc_cfg));
|
||||
vsi->tc_cfg.ena_tc = ena_tc;
|
||||
vsi->tc_cfg.numtc = num_tc;
|
||||
|
||||
@ -3616,8 +3624,10 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)
|
||||
else
|
||||
ret = ice_vsi_setup_q_map(vsi, ctx);
|
||||
|
||||
if (ret)
|
||||
if (ret) {
|
||||
memcpy(&vsi->tc_cfg, &old_tc_cfg, sizeof(vsi->tc_cfg));
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* must to indicate which section of VSI context are being modified */
|
||||
ctx->info.valid_sections = cpu_to_le16(ICE_AQ_VSI_PROP_RXQ_MAP_VALID);
|
||||
|
@ -2399,8 +2399,6 @@ int ice_schedule_reset(struct ice_pf *pf, enum ice_reset_req reset)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ice_unplug_aux_dev(pf);
|
||||
|
||||
switch (reset) {
|
||||
case ICE_RESET_PFR:
|
||||
set_bit(ICE_PFR_REQ, pf->state);
|
||||
|
Loading…
Reference in New Issue
Block a user