]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/broadcom/bcmsysport.h
net: systemport: Add support for SYSTEMPORT Lite
[karo-tx-linux.git] / drivers / net / ethernet / broadcom / bcmsysport.h
index 1c82e3da69a7bf6134389d982e15bc17697327a6..863ddd7870b77d2ce963685098fff71211f395a8 100644 (file)
@@ -127,6 +127,10 @@ struct bcm_rsb {
 #define INTRL2_0_DESC_ALLOC_ERR                (1 << 10)
 #define INTRL2_0_UNEXP_PKTSIZE_ACK     (1 << 11)
 
+/* SYSTEMPORT Lite groups the TX queues interrupts on instance 0 */
+#define INTRL2_0_TDMA_MBDONE_SHIFT     12
+#define INTRL2_0_TDMA_MBDONE_MASK      (0xffff << INTRL2_0_TDMA_MBDONE_SHIFT)
+
 /* RXCHK offset and defines */
 #define SYS_PORT_RXCHK_OFFSET          0x300
 
@@ -176,7 +180,9 @@ struct bcm_rsb {
 #define  RBUF_OK_TO_SEND_MASK          0xff
 #define  RBUF_CRC_REPLACE              (1 << 20)
 #define  RBUF_OK_TO_SEND_MODE          (1 << 21)
-#define  RBUF_RSB_SWAP                 (1 << 22)
+/* SYSTEMPORT Lite uses two bits here */
+#define  RBUF_RSB_SWAP0                        (1 << 22)
+#define  RBUF_RSB_SWAP1                        (1 << 23)
 #define  RBUF_ACPI_EN                  (1 << 23)
 
 #define RBUF_PKT_RDY_THRESH            0x04
@@ -247,6 +253,7 @@ struct bcm_rsb {
 #define  MIB_RUNT_CNT_RST              (1 << 1)
 #define  MIB_TX_CNT_RST                        (1 << 2)
 
+/* These offsets are valid for SYSTEMPORT and SYSTEMPORT Lite */
 #define UMAC_MPD_CTRL                  0x620
 #define  MPD_EN                                (1 << 0)
 #define  MSEQ_LEN_SHIFT                        16
@@ -258,6 +265,34 @@ struct bcm_rsb {
 #define UMAC_MDF_CTRL                  0x650
 #define UMAC_MDF_ADDR                  0x654
 
+/* Only valid on SYSTEMPORT Lite */
+#define SYS_PORT_GIB_OFFSET            0x1000
+
+#define GIB_CONTROL                    0x00
+#define  GIB_TX_EN                     (1 << 0)
+#define  GIB_RX_EN                     (1 << 1)
+#define  GIB_TX_FLUSH                  (1 << 2)
+#define  GIB_RX_FLUSH                  (1 << 3)
+#define  GIB_GTX_CLK_SEL_SHIFT         4
+#define  GIB_GTX_CLK_EXT_CLK           (0 << GIB_GTX_CLK_SEL_SHIFT)
+#define  GIB_GTX_CLK_125MHZ            (1 << GIB_GTX_CLK_SEL_SHIFT)
+#define  GIB_GTX_CLK_250MHZ            (2 << GIB_GTX_CLK_SEL_SHIFT)
+#define  GIB_FCS_STRIP                 (1 << 6)
+#define  GIB_LCL_LOOP_EN               (1 << 7)
+#define  GIB_LCL_LOOP_TXEN             (1 << 8)
+#define  GIB_RMT_LOOP_EN               (1 << 9)
+#define  GIB_RMT_LOOP_RXEN             (1 << 10)
+#define  GIB_RX_PAUSE_EN               (1 << 11)
+#define  GIB_PREAMBLE_LEN_SHIFT                12
+#define  GIB_PREAMBLE_LEN_MASK         0xf
+#define  GIB_IPG_LEN_SHIFT             16
+#define  GIB_IPG_LEN_MASK              0x3f
+#define  GIB_PAD_EXTENSION_SHIFT       22
+#define  GIB_PAD_EXTENSION_MASK                0x3f
+
+#define GIB_MAC1                       0x08
+#define GIB_MAC0                       0x0c
+
 /* Receive DMA offset and defines */
 #define SYS_PORT_RDMA_OFFSET           0x2000
 
@@ -409,16 +444,19 @@ struct bcm_rsb {
                                        RING_PCP_DEI_VID)
 
 #define TDMA_CONTROL                   0x600
-#define  TDMA_EN                       (1 << 0)
-#define  TSB_EN                                (1 << 1)
-#define  TSB_SWAP                      (1 << 2)
-#define  ACB_ALGO                      (1 << 3)
+#define  TDMA_EN                       0
+#define  TSB_EN                                1
+/* Uses 2 bits on SYSTEMPORT Lite and shifts everything by 1 bit, we
+ * keep the SYSTEMPORT layout here and adjust with tdma_control_bit()
+ */
+#define  TSB_SWAP                      2
+#define  ACB_ALGO                      3
 #define  BUF_DATA_OFFSET_SHIFT         4
 #define  BUF_DATA_OFFSET_MASK          0x3ff
-#define  VLAN_EN                       (1 << 14)
-#define  SW_BRCM_TAG                   (1 << 15)
-#define  WNC_KPT_SIZE_UPDATE           (1 << 16)
-#define  SYNC_PKT_SIZE                 (1 << 17)
+#define  VLAN_EN                       14
+#define  SW_BRCM_TAG                   15
+#define  WNC_KPT_SIZE_UPDATE           16
+#define  SYNC_PKT_SIZE                 17
 #define  ACH_TXDONE_DELAY_SHIFT                18
 #define  ACH_TXDONE_DELAY_MASK         0xff
 
@@ -475,12 +513,12 @@ struct dma_desc {
 };
 
 /* Number of Receive hardware descriptor words */
-#define NUM_HW_RX_DESC_WORDS           1024
-/* Real number of usable descriptors */
-#define NUM_RX_DESC                    (NUM_HW_RX_DESC_WORDS / WORDS_PER_DESC)
+#define SP_NUM_HW_RX_DESC_WORDS                1024
+#define SP_LT_NUM_HW_RX_DESC_WORDS     256
 
-/* Internal linked-list RAM has up to 1536 entries */
-#define NUM_TX_DESC                    1536
+/* Internal linked-list RAM size */
+#define SP_NUM_TX_DESC                 1536
+#define SP_LT_NUM_TX_DESC              256
 
 #define WORDS_PER_DESC                 (sizeof(struct dma_desc) / sizeof(u32))
 
@@ -627,6 +665,16 @@ struct bcm_sysport_cb {
        DEFINE_DMA_UNMAP_LEN(dma_len);
 };
 
+enum bcm_sysport_type {
+       SYSTEMPORT = 0,
+       SYSTEMPORT_LITE,
+};
+
+struct bcm_sysport_hw_params {
+       bool            is_lite;
+       unsigned int    num_rx_desc_words;
+};
+
 /* Software view of the TX ring */
 struct bcm_sysport_tx_ring {
        spinlock_t      lock;           /* Ring lock for tx reclaim/xmit */
@@ -651,6 +699,8 @@ struct bcm_sysport_priv {
        u32                     irq0_mask;
        u32                     irq1_stat;
        u32                     irq1_mask;
+       bool                    is_lite;
+       unsigned int            num_rx_desc_words;
        struct napi_struct      napi ____cacheline_aligned;
        struct net_device       *netdev;
        struct platform_device  *pdev;
@@ -659,7 +709,7 @@ struct bcm_sysport_priv {
        int                     wol_irq;
 
        /* Transmit rings */
-       struct bcm_sysport_tx_ring tx_rings[TDMA_NUM_RINGS];
+       struct bcm_sysport_tx_ring *tx_rings;
 
        /* Receive queue */
        void __iomem            *rx_bds;