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 <B38611@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f4a775d144
commit
befe821335
|
@ -308,6 +308,7 @@ struct bufdesc_ex {
|
||||||
#define RCMR_CMP_2 (RCMR_CMP_CFG(4, 0) | RCMR_CMP_CFG(5, 1) | \
|
#define RCMR_CMP_2 (RCMR_CMP_CFG(4, 0) | RCMR_CMP_CFG(5, 1) | \
|
||||||
RCMR_CMP_CFG(6, 2) | RCMR_CMP_CFG(7, 3))
|
RCMR_CMP_CFG(6, 2) | RCMR_CMP_CFG(7, 3))
|
||||||
#define RCMR_CMP(X) ((X == 1) ? RCMR_CMP_1 : RCMR_CMP_2)
|
#define RCMR_CMP(X) ((X == 1) ? RCMR_CMP_1 : RCMR_CMP_2)
|
||||||
|
#define FEC_TX_BD_FTYPE(X) ((X & 0xF) << 20)
|
||||||
|
|
||||||
/* The number of Tx and Rx buffers. These are allocated from the page
|
/* The number of Tx and Rx buffers. These are allocated from the page
|
||||||
* pool. The code may assume these are power of two, so it it best
|
* pool. The code may assume these are power of two, so it it best
|
||||||
|
|
|
@ -426,6 +426,8 @@ fec_enet_txq_submit_frag_skb(struct fec_enet_priv_tx_q *txq,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fep->bufdesc_ex) {
|
if (fep->bufdesc_ex) {
|
||||||
|
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
|
||||||
|
estatus |= FEC_TX_BD_FTYPE(queue);
|
||||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||||
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
||||||
ebdp->cbd_bdu = 0;
|
ebdp->cbd_bdu = 0;
|
||||||
|
@ -555,6 +557,9 @@ static int fec_enet_txq_submit_skb(struct fec_enet_priv_tx_q *txq,
|
||||||
fep->hwts_tx_en))
|
fep->hwts_tx_en))
|
||||||
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
||||||
|
|
||||||
|
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
|
||||||
|
estatus |= FEC_TX_BD_FTYPE(queue);
|
||||||
|
|
||||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||||
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
||||||
|
|
||||||
|
@ -599,6 +604,7 @@ fec_enet_txq_put_data_tso(struct fec_enet_priv_tx_q *txq, struct sk_buff *skb,
|
||||||
const struct platform_device_id *id_entry =
|
const struct platform_device_id *id_entry =
|
||||||
platform_get_device_id(fep->pdev);
|
platform_get_device_id(fep->pdev);
|
||||||
struct bufdesc_ex *ebdp = container_of(bdp, struct bufdesc_ex, desc);
|
struct bufdesc_ex *ebdp = container_of(bdp, struct bufdesc_ex, desc);
|
||||||
|
unsigned short queue = skb_get_queue_mapping(skb);
|
||||||
unsigned short status;
|
unsigned short status;
|
||||||
unsigned int estatus = 0;
|
unsigned int estatus = 0;
|
||||||
dma_addr_t addr;
|
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,
|
||||||
bdp->cbd_bufaddr = addr;
|
bdp->cbd_bufaddr = addr;
|
||||||
|
|
||||||
if (fep->bufdesc_ex) {
|
if (fep->bufdesc_ex) {
|
||||||
|
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
|
||||||
|
estatus |= FEC_TX_BD_FTYPE(queue);
|
||||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||||
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
||||||
ebdp->cbd_bdu = 0;
|
ebdp->cbd_bdu = 0;
|
||||||
|
@ -659,6 +667,7 @@ fec_enet_txq_put_hdr_tso(struct fec_enet_priv_tx_q *txq,
|
||||||
platform_get_device_id(fep->pdev);
|
platform_get_device_id(fep->pdev);
|
||||||
int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
|
int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
|
||||||
struct bufdesc_ex *ebdp = container_of(bdp, struct bufdesc_ex, desc);
|
struct bufdesc_ex *ebdp = container_of(bdp, struct bufdesc_ex, desc);
|
||||||
|
unsigned short queue = skb_get_queue_mapping(skb);
|
||||||
void *bufaddr;
|
void *bufaddr;
|
||||||
unsigned long dmabuf;
|
unsigned long dmabuf;
|
||||||
unsigned short status;
|
unsigned short status;
|
||||||
|
@ -692,6 +701,8 @@ fec_enet_txq_put_hdr_tso(struct fec_enet_priv_tx_q *txq,
|
||||||
bdp->cbd_datlen = hdr_len;
|
bdp->cbd_datlen = hdr_len;
|
||||||
|
|
||||||
if (fep->bufdesc_ex) {
|
if (fep->bufdesc_ex) {
|
||||||
|
if (id_entry->driver_data & FEC_QUIRK_HAS_AVB)
|
||||||
|
estatus |= FEC_TX_BD_FTYPE(queue);
|
||||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||||
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
estatus |= BD_ENET_TX_PINS | BD_ENET_TX_IINS;
|
||||||
ebdp->cbd_bdu = 0;
|
ebdp->cbd_bdu = 0;
|
||||||
|
|
Loading…
Reference in New Issue