Skip to content

Commit befe821

Browse files
Nimrod Andydavem330
authored andcommitted
net: fec: Add Ftype to BD to distiguish three tx queues for AVB
The current driver loss Ftype field init for BD, which cause tx queue #1 and #2 cannot work well. Add Ftype field to BD to distiguish three queues for AVB: 0 -> Best Effort 1 -> ClassA 2 -> ClassB Signed-off-by: Fugang Duan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent f4a775d commit befe821

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

drivers/net/ethernet/freescale/fec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ struct bufdesc_ex {
308308
#define RCMR_CMP_2 (RCMR_CMP_CFG(4, 0) | RCMR_CMP_CFG(5, 1) | \
309309
RCMR_CMP_CFG(6, 2) | RCMR_CMP_CFG(7, 3))
310310
#define RCMR_CMP(X) ((X == 1) ? RCMR_CMP_1 : RCMR_CMP_2)
311+
#define FEC_TX_BD_FTYPE(X) ((X & 0xF) << 20)
311312

312313
/* The number of Tx and Rx buffers. These are allocated from the page
313314
* pool. The code may assume these are power of two, so it it best

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,8 @@ fec_enet_txq_submit_frag_skb(struct fec_enet_priv_tx_q *txq,
426426
}
427427

428428
if (fep->bufdesc_ex) {
429+
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
430+
estatus |= FEC_TX_BD_FTYPE(queue);
429431
if (skb->ip_summed == CHECKSUM_PARTIAL)
430432
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
431433
ebdp->cbd_bdu = 0;
@@ -555,6 +557,9 @@ static int fec_enet_txq_submit_skb(struct fec_enet_priv_tx_q *txq,
555557
fep->hwts_tx_en))
556558
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
557559

560+
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
561+
estatus |= FEC_TX_BD_FTYPE(queue);
562+
558563
if (skb->ip_summed == CHECKSUM_PARTIAL)
559564
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
560565

@@ -599,6 +604,7 @@ fec_enet_txq_put_data_tso(struct fec_enet_priv_tx_q *txq, struct sk_buff *skb,
599604
const struct platform_device_id *id_entry =
600605
platform_get_device_id(fep->pdev);
601606
struct bufdesc_ex *ebdp = container_of(bdp, struct bufdesc_ex, desc);
607+
unsigned short queue = skb_get_queue_mapping(skb);
602608
unsigned short status;
603609
unsigned int estatus = 0;
604610
dma_addr_t addr;
@@ -629,6 +635,8 @@ fec_enet_txq_put_data_tso(struct fec_enet_priv_tx_q *txq, struct sk_buff *skb,
629635
bdp->cbd_bufaddr = addr;
630636

631637
if (fep->bufdesc_ex) {
638+
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
639+
estatus |= FEC_TX_BD_FTYPE(queue);
632640
if (skb->ip_summed == CHECKSUM_PARTIAL)
633641
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
634642
ebdp->cbd_bdu = 0;
@@ -659,6 +667,7 @@ fec_enet_txq_put_hdr_tso(struct fec_enet_priv_tx_q *txq,
659667
platform_get_device_id(fep->pdev);
660668
int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
661669
struct bufdesc_ex *ebdp = container_of(bdp, struct bufdesc_ex, desc);
670+
unsigned short queue = skb_get_queue_mapping(skb);
662671
void *bufaddr;
663672
unsigned long dmabuf;
664673
unsigned short status;
@@ -692,6 +701,8 @@ fec_enet_txq_put_hdr_tso(struct fec_enet_priv_tx_q *txq,
692701
bdp->cbd_datlen = hdr_len;
693702

694703
if (fep->bufdesc_ex) {
704+
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
705+
estatus |= FEC_TX_BD_FTYPE(queue);
695706
if (skb->ip_summed == CHECKSUM_PARTIAL)
696707
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
697708
ebdp->cbd_bdu = 0;

0 commit comments

Comments
 (0)