Commit 8ce84271 authored by Dmitry Bezrukov's avatar Dmitry Bezrukov Committed by David S. Miller

net: atlantic: changes for multi-TC support

This patch contains the following changes:
* access cfg via aq_nic_get_cfg() in aq_nic_start() and aq_nic_map_skb();
* call aq_nic_get_dev() just once in aq_nic_map_skb();
* move ring allocation/deallocation out of aq_vec_alloc()/aq_vec_free();
* add the missing aq_nic_deinit() in atl_resume_common();
* rename 'tcs' field to 'tcs_max' in aq_hw_caps_s to differentiate it from
  the 'tcs' field in aq_nic_cfg_s, which is used for the current number of
  TCs;
* update _TC_MAX defines to the actual number of supported TCs;
* move tx_tc_mode register defines slightly higher (just to keep the order
  of definitions);
* separate variables for TX/RX buff_size in hw_atl*_hw_qos_set();
* use AQ_HW_*_TC instead of hardcoded magic numbers;
* actually use the 'ret' value in aq_mdo_add_secy();
Signed-off-by: default avatarDmitry Bezrukov <dbezrukov@marvell.com>
Co-developed-by: default avatarMark Starovoytov <mstarovoitov@marvell.com>
Signed-off-by: default avatarMark Starovoytov <mstarovoitov@marvell.com>
Signed-off-by: default avatarIgor Russkikh <irusskikh@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 59b8d277
...@@ -46,7 +46,7 @@ struct aq_hw_caps_s { ...@@ -46,7 +46,7 @@ struct aq_hw_caps_s {
u32 mac_regs_count; u32 mac_regs_count;
u32 hw_alive_check_addr; u32 hw_alive_check_addr;
u8 msix_irqs; u8 msix_irqs;
u8 tcs; u8 tcs_max;
u8 rxd_alignment; u8 rxd_alignment;
u8 rxd_size; u8 rxd_size;
u8 txd_alignment; u8 txd_alignment;
...@@ -120,6 +120,8 @@ struct aq_stats_s { ...@@ -120,6 +120,8 @@ struct aq_stats_s {
#define AQ_HW_MULTICAST_ADDRESS_MAX 32U #define AQ_HW_MULTICAST_ADDRESS_MAX 32U
#define AQ_HW_PTP_TC 2U
#define AQ_HW_LED_BLINK 0x2U #define AQ_HW_LED_BLINK 0x2U
#define AQ_HW_LED_DEFAULT 0x0U #define AQ_HW_LED_DEFAULT 0x0U
......
...@@ -478,7 +478,7 @@ static int aq_mdo_add_secy(struct macsec_context *ctx) ...@@ -478,7 +478,7 @@ static int aq_mdo_add_secy(struct macsec_context *ctx)
set_bit(txsc_idx, &cfg->txsc_idx_busy); set_bit(txsc_idx, &cfg->txsc_idx_busy);
return 0; return ret;
} }
static int aq_mdo_upd_secy(struct macsec_context *ctx) static int aq_mdo_upd_secy(struct macsec_context *ctx)
......
...@@ -399,9 +399,15 @@ int aq_nic_init(struct aq_nic_s *self) ...@@ -399,9 +399,15 @@ int aq_nic_init(struct aq_nic_s *self)
err = aq_phy_init(self->aq_hw); err = aq_phy_init(self->aq_hw);
} }
for (i = 0U, aq_vec = self->aq_vec[0]; for (i = 0U; i < self->aq_vecs; i++) {
self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) aq_vec = self->aq_vec[i];
err = aq_vec_ring_alloc(aq_vec, self, i,
aq_nic_get_cfg(self));
if (err)
goto err_exit;
aq_vec_init(aq_vec, self->aq_hw_ops, self->aq_hw); aq_vec_init(aq_vec, self->aq_hw_ops, self->aq_hw);
}
err = aq_ptp_init(self, self->irqvecs - 1); err = aq_ptp_init(self, self->irqvecs - 1);
if (err < 0) if (err < 0)
...@@ -424,9 +430,12 @@ int aq_nic_init(struct aq_nic_s *self) ...@@ -424,9 +430,12 @@ int aq_nic_init(struct aq_nic_s *self)
int aq_nic_start(struct aq_nic_s *self) int aq_nic_start(struct aq_nic_s *self)
{ {
struct aq_vec_s *aq_vec = NULL; struct aq_vec_s *aq_vec = NULL;
struct aq_nic_cfg_s *cfg;
unsigned int i = 0U; unsigned int i = 0U;
int err = 0; int err = 0;
cfg = aq_nic_get_cfg(self);
err = self->aq_hw_ops->hw_multicast_list_set(self->aq_hw, err = self->aq_hw_ops->hw_multicast_list_set(self->aq_hw,
self->mc_list.ar, self->mc_list.ar,
self->mc_list.count); self->mc_list.count);
...@@ -464,7 +473,7 @@ int aq_nic_start(struct aq_nic_s *self) ...@@ -464,7 +473,7 @@ int aq_nic_start(struct aq_nic_s *self)
timer_setup(&self->service_timer, aq_nic_service_timer_cb, 0); timer_setup(&self->service_timer, aq_nic_service_timer_cb, 0);
aq_nic_service_timer_cb(&self->service_timer); aq_nic_service_timer_cb(&self->service_timer);
if (self->aq_nic_cfg.is_polling) { if (cfg->is_polling) {
timer_setup(&self->polling_timer, aq_nic_polling_timer_cb, 0); timer_setup(&self->polling_timer, aq_nic_polling_timer_cb, 0);
mod_timer(&self->polling_timer, jiffies + mod_timer(&self->polling_timer, jiffies +
AQ_CFG_POLLING_TIMER_INTERVAL); AQ_CFG_POLLING_TIMER_INTERVAL);
...@@ -482,16 +491,16 @@ int aq_nic_start(struct aq_nic_s *self) ...@@ -482,16 +491,16 @@ int aq_nic_start(struct aq_nic_s *self)
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
if (self->aq_nic_cfg.link_irq_vec) { if (cfg->link_irq_vec) {
int irqvec = pci_irq_vector(self->pdev, int irqvec = pci_irq_vector(self->pdev,
self->aq_nic_cfg.link_irq_vec); cfg->link_irq_vec);
err = request_threaded_irq(irqvec, NULL, err = request_threaded_irq(irqvec, NULL,
aq_linkstate_threaded_isr, aq_linkstate_threaded_isr,
IRQF_SHARED | IRQF_ONESHOT, IRQF_SHARED | IRQF_ONESHOT,
self->ndev->name, self); self->ndev->name, self);
if (err < 0) if (err < 0)
goto err_exit; goto err_exit;
self->msix_entry_mask |= (1 << self->aq_nic_cfg.link_irq_vec); self->msix_entry_mask |= (1 << cfg->link_irq_vec);
} }
err = self->aq_hw_ops->hw_irq_enable(self->aq_hw, err = self->aq_hw_ops->hw_irq_enable(self->aq_hw,
...@@ -518,6 +527,8 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb, ...@@ -518,6 +527,8 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb,
struct aq_ring_s *ring) struct aq_ring_s *ring)
{ {
unsigned int nr_frags = skb_shinfo(skb)->nr_frags; unsigned int nr_frags = skb_shinfo(skb)->nr_frags;
struct aq_nic_cfg_s *cfg = aq_nic_get_cfg(self);
struct device *dev = aq_nic_get_dev(self);
struct aq_ring_buff_s *first = NULL; struct aq_ring_buff_s *first = NULL;
u8 ipver = ip_hdr(skb)->version; u8 ipver = ip_hdr(skb)->version;
struct aq_ring_buff_s *dx_buff; struct aq_ring_buff_s *dx_buff;
...@@ -559,7 +570,7 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb, ...@@ -559,7 +570,7 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb,
need_context_tag = true; need_context_tag = true;
} }
if (self->aq_nic_cfg.is_vlan_tx_insert && skb_vlan_tag_present(skb)) { if (cfg->is_vlan_tx_insert && skb_vlan_tag_present(skb)) {
dx_buff->vlan_tx_tag = skb_vlan_tag_get(skb); dx_buff->vlan_tx_tag = skb_vlan_tag_get(skb);
dx_buff->len_pkt = skb->len; dx_buff->len_pkt = skb->len;
dx_buff->is_vlan = 1U; dx_buff->is_vlan = 1U;
...@@ -574,12 +585,12 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb, ...@@ -574,12 +585,12 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb,
} }
dx_buff->len = skb_headlen(skb); dx_buff->len = skb_headlen(skb);
dx_buff->pa = dma_map_single(aq_nic_get_dev(self), dx_buff->pa = dma_map_single(dev,
skb->data, skb->data,
dx_buff->len, dx_buff->len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(aq_nic_get_dev(self), dx_buff->pa))) { if (unlikely(dma_mapping_error(dev, dx_buff->pa))) {
ret = 0; ret = 0;
goto exit; goto exit;
} }
...@@ -611,13 +622,13 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb, ...@@ -611,13 +622,13 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb,
else else
buff_size = frag_len; buff_size = frag_len;
frag_pa = skb_frag_dma_map(aq_nic_get_dev(self), frag_pa = skb_frag_dma_map(dev,
frag, frag,
buff_offset, buff_offset,
buff_size, buff_size,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(aq_nic_get_dev(self), if (unlikely(dma_mapping_error(dev,
frag_pa))) frag_pa)))
goto mapping_error; goto mapping_error;
...@@ -651,12 +662,12 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb, ...@@ -651,12 +662,12 @@ unsigned int aq_nic_map_skb(struct aq_nic_s *self, struct sk_buff *skb,
if (!(dx_buff->is_gso_tcp || dx_buff->is_gso_udp) && if (!(dx_buff->is_gso_tcp || dx_buff->is_gso_udp) &&
!dx_buff->is_vlan && dx_buff->pa) { !dx_buff->is_vlan && dx_buff->pa) {
if (unlikely(dx_buff->is_sop)) { if (unlikely(dx_buff->is_sop)) {
dma_unmap_single(aq_nic_get_dev(self), dma_unmap_single(dev,
dx_buff->pa, dx_buff->pa,
dx_buff->len, dx_buff->len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
} else { } else {
dma_unmap_page(aq_nic_get_dev(self), dma_unmap_page(dev,
dx_buff->pa, dx_buff->pa,
dx_buff->len, dx_buff->len,
DMA_TO_DEVICE); DMA_TO_DEVICE);
...@@ -1145,9 +1156,11 @@ void aq_nic_deinit(struct aq_nic_s *self, bool link_down) ...@@ -1145,9 +1156,11 @@ void aq_nic_deinit(struct aq_nic_s *self, bool link_down)
if (!self) if (!self)
goto err_exit; goto err_exit;
for (i = 0U, aq_vec = self->aq_vec[0]; for (i = 0U; i < self->aq_vecs; i++) {
self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) aq_vec = self->aq_vec[i];
aq_vec_deinit(aq_vec); aq_vec_deinit(aq_vec);
aq_vec_ring_free(aq_vec);
}
aq_ptp_unregister(self); aq_ptp_unregister(self);
aq_ptp_ring_deinit(self); aq_ptp_ring_deinit(self);
......
...@@ -431,6 +431,9 @@ static int atl_resume_common(struct device *dev, bool deep) ...@@ -431,6 +431,9 @@ static int atl_resume_common(struct device *dev, bool deep)
netif_tx_start_all_queues(nic->ndev); netif_tx_start_all_queues(nic->ndev);
err_exit: err_exit:
if (ret < 0)
aq_nic_deinit(nic, true);
rtnl_unlock(); rtnl_unlock();
return ret; return ret;
......
...@@ -103,16 +103,11 @@ static int aq_vec_poll(struct napi_struct *napi, int budget) ...@@ -103,16 +103,11 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)
struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx, struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx,
struct aq_nic_cfg_s *aq_nic_cfg) struct aq_nic_cfg_s *aq_nic_cfg)
{ {
struct aq_ring_s *ring = NULL;
struct aq_vec_s *self = NULL; struct aq_vec_s *self = NULL;
unsigned int i = 0U;
int err = 0;
self = kzalloc(sizeof(*self), GFP_KERNEL); self = kzalloc(sizeof(*self), GFP_KERNEL);
if (!self) { if (!self)
err = -ENOMEM;
goto err_exit; goto err_exit;
}
self->aq_nic = aq_nic; self->aq_nic = aq_nic;
self->aq_ring_param.vec_idx = idx; self->aq_ring_param.vec_idx = idx;
...@@ -128,10 +123,19 @@ struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx, ...@@ -128,10 +123,19 @@ struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx,
netif_napi_add(aq_nic_get_ndev(aq_nic), &self->napi, netif_napi_add(aq_nic_get_ndev(aq_nic), &self->napi,
aq_vec_poll, AQ_CFG_NAPI_WEIGHT); aq_vec_poll, AQ_CFG_NAPI_WEIGHT);
err_exit:
return self;
}
int aq_vec_ring_alloc(struct aq_vec_s *self, struct aq_nic_s *aq_nic,
unsigned int idx, struct aq_nic_cfg_s *aq_nic_cfg)
{
struct aq_ring_s *ring = NULL;
unsigned int i = 0U;
int err = 0;
for (i = 0; i < aq_nic_cfg->tcs; ++i) { for (i = 0; i < aq_nic_cfg->tcs; ++i) {
unsigned int idx_ring = AQ_NIC_TCVEC2RING(self->nic, unsigned int idx_ring = AQ_NIC_TCVEC2RING(aq_nic, i, idx);
self->tx_rings,
self->aq_ring_param.vec_idx);
ring = aq_ring_tx_alloc(&self->ring[i][AQ_VEC_TX_ID], aq_nic, ring = aq_ring_tx_alloc(&self->ring[i][AQ_VEC_TX_ID], aq_nic,
idx_ring, aq_nic_cfg); idx_ring, aq_nic_cfg);
...@@ -156,11 +160,11 @@ struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx, ...@@ -156,11 +160,11 @@ struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx,
err_exit: err_exit:
if (err < 0) { if (err < 0) {
aq_vec_free(self); aq_vec_ring_free(self);
self = NULL; self = NULL;
} }
return self; return err;
} }
int aq_vec_init(struct aq_vec_s *self, const struct aq_hw_ops *aq_hw_ops, int aq_vec_init(struct aq_vec_s *self, const struct aq_hw_ops *aq_hw_ops,
...@@ -269,6 +273,18 @@ err_exit:; ...@@ -269,6 +273,18 @@ err_exit:;
} }
void aq_vec_free(struct aq_vec_s *self) void aq_vec_free(struct aq_vec_s *self)
{
if (!self)
goto err_exit;
netif_napi_del(&self->napi);
kfree(self);
err_exit:;
}
void aq_vec_ring_free(struct aq_vec_s *self)
{ {
struct aq_ring_s *ring = NULL; struct aq_ring_s *ring = NULL;
unsigned int i = 0U; unsigned int i = 0U;
...@@ -279,13 +295,12 @@ void aq_vec_free(struct aq_vec_s *self) ...@@ -279,13 +295,12 @@ void aq_vec_free(struct aq_vec_s *self)
for (i = 0U, ring = self->ring[0]; for (i = 0U, ring = self->ring[0];
self->tx_rings > i; ++i, ring = self->ring[i]) { self->tx_rings > i; ++i, ring = self->ring[i]) {
aq_ring_free(&ring[AQ_VEC_TX_ID]); aq_ring_free(&ring[AQ_VEC_TX_ID]);
if (i < self->rx_rings)
aq_ring_free(&ring[AQ_VEC_RX_ID]); aq_ring_free(&ring[AQ_VEC_RX_ID]);
} }
netif_napi_del(&self->napi); self->tx_rings = 0;
self->rx_rings = 0;
kfree(self);
err_exit:; err_exit:;
} }
......
...@@ -25,10 +25,13 @@ irqreturn_t aq_vec_isr(int irq, void *private); ...@@ -25,10 +25,13 @@ irqreturn_t aq_vec_isr(int irq, void *private);
irqreturn_t aq_vec_isr_legacy(int irq, void *private); irqreturn_t aq_vec_isr_legacy(int irq, void *private);
struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx, struct aq_vec_s *aq_vec_alloc(struct aq_nic_s *aq_nic, unsigned int idx,
struct aq_nic_cfg_s *aq_nic_cfg); struct aq_nic_cfg_s *aq_nic_cfg);
int aq_vec_ring_alloc(struct aq_vec_s *self, struct aq_nic_s *aq_nic,
unsigned int idx, struct aq_nic_cfg_s *aq_nic_cfg);
int aq_vec_init(struct aq_vec_s *self, const struct aq_hw_ops *aq_hw_ops, int aq_vec_init(struct aq_vec_s *self, const struct aq_hw_ops *aq_hw_ops,
struct aq_hw_s *aq_hw); struct aq_hw_s *aq_hw);
void aq_vec_deinit(struct aq_vec_s *self); void aq_vec_deinit(struct aq_vec_s *self);
void aq_vec_free(struct aq_vec_s *self); void aq_vec_free(struct aq_vec_s *self);
void aq_vec_ring_free(struct aq_vec_s *self);
int aq_vec_start(struct aq_vec_s *self); int aq_vec_start(struct aq_vec_s *self);
void aq_vec_stop(struct aq_vec_s *self); void aq_vec_stop(struct aq_vec_s *self);
cpumask_t *aq_vec_get_affinity_mask(struct aq_vec_s *self); cpumask_t *aq_vec_get_affinity_mask(struct aq_vec_s *self);
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
.msix_irqs = 4U, \ .msix_irqs = 4U, \
.irq_mask = ~0U, \ .irq_mask = ~0U, \
.vecs = HW_ATL_A0_RSS_MAX, \ .vecs = HW_ATL_A0_RSS_MAX, \
.tcs = HW_ATL_A0_TC_MAX, \ .tcs_max = HW_ATL_A0_TC_MAX, \
.rxd_alignment = 1U, \ .rxd_alignment = 1U, \
.rxd_size = HW_ATL_A0_RXD_SIZE, \ .rxd_size = HW_ATL_A0_RXD_SIZE, \
.rxds_max = HW_ATL_A0_MAX_RXD, \ .rxds_max = HW_ATL_A0_MAX_RXD, \
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
.msix_irqs = 8U, \ .msix_irqs = 8U, \
.irq_mask = ~0U, \ .irq_mask = ~0U, \
.vecs = HW_ATL_B0_RSS_MAX, \ .vecs = HW_ATL_B0_RSS_MAX, \
.tcs = HW_ATL_B0_TC_MAX, \ .tcs_max = HW_ATL_B0_TC_MAX, \
.rxd_alignment = 1U, \ .rxd_alignment = 1U, \
.rxd_size = HW_ATL_B0_RXD_SIZE, \ .rxd_size = HW_ATL_B0_RXD_SIZE, \
.rxds_max = HW_ATL_B0_MAX_RXD, \ .rxds_max = HW_ATL_B0_MAX_RXD, \
...@@ -116,8 +116,9 @@ static int hw_atl_b0_set_fc(struct aq_hw_s *self, u32 fc, u32 tc) ...@@ -116,8 +116,9 @@ static int hw_atl_b0_set_fc(struct aq_hw_s *self, u32 fc, u32 tc)
static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self) static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self)
{ {
u32 tx_buff_size = HW_ATL_B0_TXBUF_MAX;
u32 rx_buff_size = HW_ATL_B0_RXBUF_MAX;
unsigned int i_priority = 0U; unsigned int i_priority = 0U;
u32 buff_size = 0U;
u32 tc = 0U; u32 tc = 0U;
/* TPS Descriptor rate init */ /* TPS Descriptor rate init */
...@@ -131,8 +132,6 @@ static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self) ...@@ -131,8 +132,6 @@ static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self)
hw_atl_tps_tx_pkt_shed_desc_tc_arb_mode_set(self, 0U); hw_atl_tps_tx_pkt_shed_desc_tc_arb_mode_set(self, 0U);
hw_atl_tps_tx_pkt_shed_data_arb_mode_set(self, 0U); hw_atl_tps_tx_pkt_shed_data_arb_mode_set(self, 0U);
tc = 0;
/* TX Packet Scheduler Data TC0 */ /* TX Packet Scheduler Data TC0 */
hw_atl_tps_tx_pkt_shed_tc_data_max_credit_set(self, 0xFFF, tc); hw_atl_tps_tx_pkt_shed_tc_data_max_credit_set(self, 0xFFF, tc);
hw_atl_tps_tx_pkt_shed_tc_data_weight_set(self, 0x64, tc); hw_atl_tps_tx_pkt_shed_tc_data_weight_set(self, 0x64, tc);
...@@ -140,46 +139,41 @@ static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self) ...@@ -140,46 +139,41 @@ static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self)
hw_atl_tps_tx_pkt_shed_desc_tc_weight_set(self, 0x1E, tc); hw_atl_tps_tx_pkt_shed_desc_tc_weight_set(self, 0x1E, tc);
/* Tx buf size TC0 */ /* Tx buf size TC0 */
buff_size = HW_ATL_B0_TXBUF_MAX - HW_ATL_B0_PTP_TXBUF_SIZE; tx_buff_size -= HW_ATL_B0_PTP_TXBUF_SIZE;
hw_atl_tpb_tx_pkt_buff_size_per_tc_set(self, buff_size, tc); hw_atl_tpb_tx_pkt_buff_size_per_tc_set(self, tx_buff_size, tc);
hw_atl_tpb_tx_buff_hi_threshold_per_tc_set(self, hw_atl_tpb_tx_buff_hi_threshold_per_tc_set(self,
(buff_size * (tx_buff_size *
(1024 / 32U) * 66U) / (1024 / 32U) * 66U) /
100U, tc); 100U, tc);
hw_atl_tpb_tx_buff_lo_threshold_per_tc_set(self, hw_atl_tpb_tx_buff_lo_threshold_per_tc_set(self,
(buff_size * (tx_buff_size *
(1024 / 32U) * 50U) / (1024 / 32U) * 50U) /
100U, tc); 100U, tc);
/* Init TC2 for PTP_TX */ /* Init TC2 for PTP_TX */
tc = 2;
hw_atl_tpb_tx_pkt_buff_size_per_tc_set(self, HW_ATL_B0_PTP_TXBUF_SIZE, hw_atl_tpb_tx_pkt_buff_size_per_tc_set(self, HW_ATL_B0_PTP_TXBUF_SIZE,
tc); AQ_HW_PTP_TC);
/* QoS Rx buf size per TC */ /* QoS Rx buf size per TC */
tc = 0; rx_buff_size -= HW_ATL_B0_PTP_RXBUF_SIZE;
buff_size = HW_ATL_B0_RXBUF_MAX - HW_ATL_B0_PTP_RXBUF_SIZE;
hw_atl_rpb_rx_pkt_buff_size_per_tc_set(self, buff_size, tc); hw_atl_rpb_rx_pkt_buff_size_per_tc_set(self, rx_buff_size, tc);
hw_atl_rpb_rx_buff_hi_threshold_per_tc_set(self, hw_atl_rpb_rx_buff_hi_threshold_per_tc_set(self,
(buff_size * (rx_buff_size *
(1024U / 32U) * 66U) / (1024U / 32U) * 66U) /
100U, tc); 100U, tc);
hw_atl_rpb_rx_buff_lo_threshold_per_tc_set(self, hw_atl_rpb_rx_buff_lo_threshold_per_tc_set(self,
(buff_size * (rx_buff_size *
(1024U / 32U) * 50U) / (1024U / 32U) * 50U) /
100U, tc); 100U, tc);
hw_atl_b0_set_fc(self, self->aq_nic_cfg->fc.req, tc); hw_atl_b0_set_fc(self, self->aq_nic_cfg->fc.req, tc);
/* Init TC2 for PTP_RX */ /* Init TC2 for PTP_RX */
tc = 2;
hw_atl_rpb_rx_pkt_buff_size_per_tc_set(self, HW_ATL_B0_PTP_RXBUF_SIZE, hw_atl_rpb_rx_pkt_buff_size_per_tc_set(self, HW_ATL_B0_PTP_RXBUF_SIZE,
tc); AQ_HW_PTP_TC);
/* No flow control for PTP */ /* No flow control for PTP */
hw_atl_rpb_rx_xoff_en_per_tc_set(self, 0U, tc); hw_atl_rpb_rx_xoff_en_per_tc_set(self, 0U, AQ_HW_PTP_TC);
/* QoS 802.1p priority -> TC mapping */ /* QoS 802.1p priority -> TC mapping */
for (i_priority = 8U; i_priority--;) for (i_priority = 8U; i_priority--;)
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
#define HW_ATL_B0_RSS_HASHKEY_BITS 320U #define HW_ATL_B0_RSS_HASHKEY_BITS 320U
#define HW_ATL_B0_TCRSS_4_8 1 #define HW_ATL_B0_TCRSS_4_8 1
#define HW_ATL_B0_TC_MAX 1U #define HW_ATL_B0_TC_MAX 8U
#define HW_ATL_B0_RSS_MAX 8U #define HW_ATL_B0_RSS_MAX 8U
#define HW_ATL_B0_LRO_RXD_MAX 16U #define HW_ATL_B0_LRO_RXD_MAX 16U
......
...@@ -2038,6 +2038,24 @@ ...@@ -2038,6 +2038,24 @@
/* default value of bitfield lso_tcp_flag_mid[b:0] */ /* default value of bitfield lso_tcp_flag_mid[b:0] */
#define HW_ATL_THM_LSO_TCP_FLAG_MID_DEFAULT 0x0 #define HW_ATL_THM_LSO_TCP_FLAG_MID_DEFAULT 0x0
/* tx tx_tc_mode bitfield definitions
* preprocessor definitions for the bitfield "tx_tc_mode".
* port="pif_tpb_tx_tc_mode_i,pif_tps_tx_tc_mode_i"
*/
/* register address for bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_ADDR 0x00007900
/* bitmask for bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_MSK 0x00000100
/* inverted bitmask for bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_MSKN 0xFFFFFEFF
/* lower bit position of bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_SHIFT 8
/* width of bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_WIDTH 1
/* default value of bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_DEFAULT 0x0
/* tx tx_buf_en bitfield definitions /* tx tx_buf_en bitfield definitions
* preprocessor definitions for the bitfield "tx_buf_en". * preprocessor definitions for the bitfield "tx_buf_en".
* port="pif_tpb_tx_buf_en_i" * port="pif_tpb_tx_buf_en_i"
...@@ -2056,19 +2074,6 @@ ...@@ -2056,19 +2074,6 @@
/* default value of bitfield tx_buf_en */ /* default value of bitfield tx_buf_en */
#define HW_ATL_TPB_TX_BUF_EN_DEFAULT 0x0 #define HW_ATL_TPB_TX_BUF_EN_DEFAULT 0x0
/* register address for bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_ADDR 0x00007900
/* bitmask for bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_MSK 0x00000100
/* inverted bitmask for bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_MSKN 0xFFFFFEFF
/* lower bit position of bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_SHIFT 8
/* width of bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_WIDTH 1
/* default value of bitfield tx_tc_mode */
#define HW_ATL_TPB_TX_TC_MODE_DEFAULT 0x0
/* tx tx{b}_hi_thresh[c:0] bitfield definitions /* tx tx{b}_hi_thresh[c:0] bitfield definitions
* preprocessor definitions for the bitfield "tx{b}_hi_thresh[c:0]". * preprocessor definitions for the bitfield "tx{b}_hi_thresh[c:0]".
* parameter: buffer {b} | stride size 0x10 | range [0, 7] * parameter: buffer {b} | stride size 0x10 | range [0, 7]
......
...@@ -23,7 +23,7 @@ static int hw_atl2_act_rslvr_table_set(struct aq_hw_s *self, u8 location, ...@@ -23,7 +23,7 @@ static int hw_atl2_act_rslvr_table_set(struct aq_hw_s *self, u8 location,
.msix_irqs = 8U, \ .msix_irqs = 8U, \
.irq_mask = ~0U, \ .irq_mask = ~0U, \
.vecs = HW_ATL2_RSS_MAX, \ .vecs = HW_ATL2_RSS_MAX, \
.tcs = HW_ATL2_TC_MAX, \ .tcs_max = HW_ATL2_TC_MAX, \
.rxd_alignment = 1U, \ .rxd_alignment = 1U, \
.rxd_size = HW_ATL2_RXD_SIZE, \ .rxd_size = HW_ATL2_RXD_SIZE, \
.rxds_max = HW_ATL2_MAX_RXD, \ .rxds_max = HW_ATL2_MAX_RXD, \
...@@ -126,8 +126,6 @@ static int hw_atl2_hw_qos_set(struct aq_hw_s *self) ...@@ -126,8 +126,6 @@ static int hw_atl2_hw_qos_set(struct aq_hw_s *self)
hw_atl_tps_tx_pkt_shed_desc_tc_arb_mode_set(self, 0U); hw_atl_tps_tx_pkt_shed_desc_tc_arb_mode_set(self, 0U);
hw_atl_tps_tx_pkt_shed_data_arb_mode_set(self, 0U); hw_atl_tps_tx_pkt_shed_data_arb_mode_set(self, 0U);
tc = 0;
/* TX Packet Scheduler Data TC0 */ /* TX Packet Scheduler Data TC0 */
hw_atl2_tps_tx_pkt_shed_tc_data_max_credit_set(self, 0xFFF0, tc); hw_atl2_tps_tx_pkt_shed_tc_data_max_credit_set(self, 0xFFF0, tc);
hw_atl2_tps_tx_pkt_shed_tc_data_weight_set(self, 0x640, tc); hw_atl2_tps_tx_pkt_shed_tc_data_weight_set(self, 0x640, tc);
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#define HW_ATL2_RSS_REDIRECTION_MAX 64U #define HW_ATL2_RSS_REDIRECTION_MAX 64U
#define HW_ATL2_TC_MAX 1U #define HW_ATL2_TC_MAX 8U
#define HW_ATL2_RSS_MAX 8U #define HW_ATL2_RSS_MAX 8U
#define HW_ATL2_INTR_MODER_MAX 0x1FF #define HW_ATL2_INTR_MODER_MAX 0x1FF
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment