提交 054f6372 编写于 作者: T Thomas Petazzoni 提交者: David S. Miller

net: mvpp2: introduce an intermediate union for the TX/RX descriptors

Since the format of the HW descriptors is different between PPv2.1 and
PPv2.2, this commit introduces an intermediate union, with for now
only the PPv2.1 descriptors. The bulk of the driver code only
manipulates opaque mvpp2_tx_desc and mvpp2_rx_desc pointers, and the
descriptors can only be accessed and modified through the accessor
functions. A follow-up commit will add the descriptor definitions for
PPv2.2.
Signed-off-by: NThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 faca9247
...@@ -739,7 +739,8 @@ struct mvpp2_port { ...@@ -739,7 +739,8 @@ struct mvpp2_port {
#define MVPP2_RXD_L3_IP6 BIT(30) #define MVPP2_RXD_L3_IP6 BIT(30)
#define MVPP2_RXD_BUF_HDR BIT(31) #define MVPP2_RXD_BUF_HDR BIT(31)
struct mvpp2_tx_desc { /* HW TX descriptor for PPv2.1 */
struct mvpp21_tx_desc {
u32 command; /* Options used by HW for packet transmitting.*/ u32 command; /* Options used by HW for packet transmitting.*/
u8 packet_offset; /* the offset from the buffer beginning */ u8 packet_offset; /* the offset from the buffer beginning */
u8 phys_txq; /* destination queue ID */ u8 phys_txq; /* destination queue ID */
...@@ -750,7 +751,8 @@ struct mvpp2_tx_desc { ...@@ -750,7 +751,8 @@ struct mvpp2_tx_desc {
u32 reserved2; /* reserved (for future use) */ u32 reserved2; /* reserved (for future use) */
}; };
struct mvpp2_rx_desc { /* HW RX descriptor for PPv2.1 */
struct mvpp21_rx_desc {
u32 status; /* info about received packet */ u32 status; /* info about received packet */
u16 reserved1; /* parser_info (for future use, PnC) */ u16 reserved1; /* parser_info (for future use, PnC) */
u16 data_size; /* size of received packet in bytes */ u16 data_size; /* size of received packet in bytes */
...@@ -765,6 +767,21 @@ struct mvpp2_rx_desc { ...@@ -765,6 +767,21 @@ struct mvpp2_rx_desc {
u32 reserved8; u32 reserved8;
}; };
/* Opaque type used by the driver to manipulate the HW TX and RX
* descriptors
*/
struct mvpp2_tx_desc {
union {
struct mvpp21_tx_desc pp21;
};
};
struct mvpp2_rx_desc {
union {
struct mvpp21_rx_desc pp21;
};
};
struct mvpp2_txq_pcpu_buf { struct mvpp2_txq_pcpu_buf {
/* Transmitted SKB */ /* Transmitted SKB */
struct sk_buff *skb; struct sk_buff *skb;
...@@ -952,78 +969,78 @@ static u32 mvpp2_read(struct mvpp2 *priv, u32 offset) ...@@ -952,78 +969,78 @@ static u32 mvpp2_read(struct mvpp2 *priv, u32 offset)
static dma_addr_t mvpp2_txdesc_dma_addr_get(struct mvpp2_port *port, static dma_addr_t mvpp2_txdesc_dma_addr_get(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc) struct mvpp2_tx_desc *tx_desc)
{ {
return tx_desc->buf_dma_addr; return tx_desc->pp21.buf_dma_addr;
} }
static void mvpp2_txdesc_dma_addr_set(struct mvpp2_port *port, static void mvpp2_txdesc_dma_addr_set(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc, struct mvpp2_tx_desc *tx_desc,
dma_addr_t dma_addr) dma_addr_t dma_addr)
{ {
tx_desc->buf_dma_addr = dma_addr; tx_desc->pp21.buf_dma_addr = dma_addr;
} }
static size_t mvpp2_txdesc_size_get(struct mvpp2_port *port, static size_t mvpp2_txdesc_size_get(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc) struct mvpp2_tx_desc *tx_desc)
{ {
return tx_desc->data_size; return tx_desc->pp21.data_size;
} }
static void mvpp2_txdesc_size_set(struct mvpp2_port *port, static void mvpp2_txdesc_size_set(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc, struct mvpp2_tx_desc *tx_desc,
size_t size) size_t size)
{ {
tx_desc->data_size = size; tx_desc->pp21.data_size = size;
} }
static void mvpp2_txdesc_txq_set(struct mvpp2_port *port, static void mvpp2_txdesc_txq_set(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc, struct mvpp2_tx_desc *tx_desc,
unsigned int txq) unsigned int txq)
{ {
tx_desc->phys_txq = txq; tx_desc->pp21.phys_txq = txq;
} }
static void mvpp2_txdesc_cmd_set(struct mvpp2_port *port, static void mvpp2_txdesc_cmd_set(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc, struct mvpp2_tx_desc *tx_desc,
unsigned int command) unsigned int command)
{ {
tx_desc->command = command; tx_desc->pp21.command = command;
} }
static void mvpp2_txdesc_offset_set(struct mvpp2_port *port, static void mvpp2_txdesc_offset_set(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc, struct mvpp2_tx_desc *tx_desc,
unsigned int offset) unsigned int offset)
{ {
tx_desc->packet_offset = offset; tx_desc->pp21.packet_offset = offset;
} }
static unsigned int mvpp2_txdesc_offset_get(struct mvpp2_port *port, static unsigned int mvpp2_txdesc_offset_get(struct mvpp2_port *port,
struct mvpp2_tx_desc *tx_desc) struct mvpp2_tx_desc *tx_desc)
{ {
return tx_desc->packet_offset; return tx_desc->pp21.packet_offset;
} }
static dma_addr_t mvpp2_rxdesc_dma_addr_get(struct mvpp2_port *port, static dma_addr_t mvpp2_rxdesc_dma_addr_get(struct mvpp2_port *port,
struct mvpp2_rx_desc *rx_desc) struct mvpp2_rx_desc *rx_desc)
{ {
return rx_desc->buf_dma_addr; return rx_desc->pp21.buf_dma_addr;
} }
static unsigned long mvpp2_rxdesc_cookie_get(struct mvpp2_port *port, static unsigned long mvpp2_rxdesc_cookie_get(struct mvpp2_port *port,
struct mvpp2_rx_desc *rx_desc) struct mvpp2_rx_desc *rx_desc)
{ {
return rx_desc->buf_cookie; return rx_desc->pp21.buf_cookie;
} }
static size_t mvpp2_rxdesc_size_get(struct mvpp2_port *port, static size_t mvpp2_rxdesc_size_get(struct mvpp2_port *port,
struct mvpp2_rx_desc *rx_desc) struct mvpp2_rx_desc *rx_desc)
{ {
return rx_desc->data_size; return rx_desc->pp21.data_size;
} }
static u32 mvpp2_rxdesc_status_get(struct mvpp2_port *port, static u32 mvpp2_rxdesc_status_get(struct mvpp2_port *port,
struct mvpp2_rx_desc *rx_desc) struct mvpp2_rx_desc *rx_desc)
{ {
return rx_desc->status; return rx_desc->pp21.status;
} }
static void mvpp2_txq_inc_get(struct mvpp2_txq_pcpu *txq_pcpu) static void mvpp2_txq_inc_get(struct mvpp2_txq_pcpu *txq_pcpu)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册