Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Staging: Netlogic: Move all the netdev under single parent device

XLR has one network controller and XLS has two network controllers, each
controller has 4 gmac devices. This patch initializes each controller as
a parent device and the four gmac devices of a controller are connected
to the parent controller as a child

Signed-off-by: Ganesan Ramalingam <ganesanr@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Ganesan Ramalingam and committed by
Greg Kroah-Hartman
f8397bc6 e1a083be

+278 -227
-1
drivers/staging/netlogic/TODO
··· 1 1 * Implementing 64bit stat counter in software 2 2 * All memory allocation should be changed to DMA allocations 3 - * All the netdev should be linked to single pdev as parent 4 3 * Changing comments in to linux standred format 5 4 6 5 Please send patches
+112 -90
drivers/staging/netlogic/platform_net.c
··· 72 72 PIC_GMAC_6_IRQ, PIC_GMAC_7_IRQ 73 73 }; 74 74 75 - static struct xlr_net_data ndata[MAX_NUM_GMAC]; 76 - static struct resource xlr_net_res[8][2]; 77 - static struct platform_device xlr_net_dev[8]; 78 - static u32 __iomem *gmac0_addr; 75 + static struct resource xlr_net0_res[8]; 76 + static struct resource xlr_net1_res[8]; 79 77 static u32 __iomem *gmac4_addr; 80 78 static u32 __iomem *gpio_addr; 81 79 82 - static void config_mac(struct xlr_net_data *nd, int phy, u32 __iomem *serdes, 83 - u32 __iomem *pcs, int rfr, int tx, int *bkt_size, 84 - struct xlr_fmn_info *gmac_fmn_info, int phy_addr) 80 + static void xlr_resource_init(struct resource *res, int offset, int irq) 85 81 { 86 - nd->cpu_mask = nlm_current_node()->coremask; 87 - nd->phy_interface = phy; 88 - nd->rfr_station = rfr; 89 - nd->tx_stnid = tx; 90 - nd->mii_addr = gmac0_addr; 91 - nd->serdes_addr = serdes; 92 - nd->pcs_addr = pcs; 93 - nd->gpio_addr = gpio_addr; 82 + res->name = "gmac"; 94 83 95 - nd->bucket_size = bkt_size; 96 - nd->gmac_fmn_info = gmac_fmn_info; 97 - nd->phy_addr = phy_addr; 84 + res->start = CPHYSADDR(nlm_mmio_base(offset)); 85 + res->end = res->start + 0xfff; 86 + res->flags = IORESOURCE_MEM; 87 + 88 + res++; 89 + res->name = "gmac"; 90 + res->start = res->end = irq; 91 + res->flags = IORESOURCE_IRQ; 98 92 } 99 93 100 - static void net_device_init(int id, struct resource *res, int offset, int irq) 94 + static struct platform_device *gmac_controller2_init(void *gmac0_addr) 101 95 { 102 - res[0].name = "gmac"; 103 - res[0].start = CPHYSADDR(nlm_mmio_base(offset)); 104 - res[0].end = res[0].start + 0xfff; 105 - res[0].flags = IORESOURCE_MEM; 96 + int mac; 97 + static struct xlr_net_data ndata1 = { 98 + .phy_interface = PHY_INTERFACE_MODE_SGMII, 99 + .rfr_station = FMN_STNID_GMAC1_FR_0, 100 + .bucket_size = xlr_board_fmn_config.bucket_size, 101 + .gmac_fmn_info = &xlr_board_fmn_config.gmac[1], 102 + }; 106 103 107 - res[1].name = "gmac"; 108 - res[1].start = irq; 109 - res[1].end = irq; 110 - res[1].flags = IORESOURCE_IRQ; 104 + static struct platform_device xlr_net_dev1 = { 105 + .name = "xlr-net", 106 + .id = 1, 107 + .dev.platform_data = &ndata1, 108 + }; 111 109 112 - xlr_net_dev[id].name = "xlr-net"; 113 - xlr_net_dev[id].id = id; 114 - xlr_net_dev[id].num_resources = 2; 115 - xlr_net_dev[id].resource = res; 116 - xlr_net_dev[id].dev.platform_data = &ndata[id]; 110 + gmac4_addr = ioremap(CPHYSADDR( 111 + nlm_mmio_base(NETLOGIC_IO_GMAC_4_OFFSET)), 0xfff); 112 + ndata1.serdes_addr = gmac4_addr; 113 + ndata1.pcs_addr = gmac4_addr; 114 + ndata1.mii_addr = gmac0_addr; 115 + ndata1.gpio_addr = gpio_addr; 116 + ndata1.cpu_mask = nlm_current_node()->coremask; 117 + 118 + xlr_net_dev1.resource = xlr_net1_res; 119 + 120 + for (mac = 0; mac < 4; mac++) { 121 + ndata1.tx_stnid[mac] = FMN_STNID_GMAC1_TX0 + mac; 122 + ndata1.phy_addr[mac] = mac + 4 + 0x10; 123 + 124 + xlr_resource_init(&xlr_net1_res[mac * 2], 125 + xlr_gmac_offsets[mac + 4], 126 + xlr_gmac_irqs[mac + 4]); 127 + } 128 + xlr_net_dev1.num_resources = 8; 129 + 130 + return &xlr_net_dev1; 117 131 } 118 132 119 133 static void xls_gmac_init(void) 120 134 { 121 135 int mac; 136 + struct platform_device *xlr_net_dev1; 137 + void __iomem *gmac0_addr = ioremap(CPHYSADDR( 138 + nlm_mmio_base(NETLOGIC_IO_GMAC_0_OFFSET)), 0xfff); 122 139 123 - gmac4_addr = ioremap(CPHYSADDR( 124 - nlm_mmio_base(NETLOGIC_IO_GMAC_4_OFFSET)), 0xfff); 125 - /* Passing GPIO base for serdes init. Only needed on sgmii ports*/ 140 + static struct xlr_net_data ndata0 = { 141 + .rfr_station = FMN_STNID_GMACRFR_0, 142 + .bucket_size = xlr_board_fmn_config.bucket_size, 143 + .gmac_fmn_info = &xlr_board_fmn_config.gmac[0], 144 + }; 145 + 146 + static struct platform_device xlr_net_dev0 = { 147 + .name = "xlr-net", 148 + .id = 0, 149 + }; 150 + xlr_net_dev0.dev.platform_data = &ndata0; 151 + ndata0.serdes_addr = gmac0_addr; 152 + ndata0.pcs_addr = gmac0_addr; 153 + ndata0.mii_addr = gmac0_addr; 154 + 155 + /* Passing GPIO base for serdes init. Only needed on sgmii ports */ 126 156 gpio_addr = ioremap(CPHYSADDR( 127 157 nlm_mmio_base(NETLOGIC_IO_GPIO_OFFSET)), 0xfff); 158 + ndata0.gpio_addr = gpio_addr; 159 + ndata0.cpu_mask = nlm_current_node()->coremask; 160 + 161 + xlr_net_dev0.resource = xlr_net0_res; 128 162 129 163 switch (nlm_prom_info.board_major_version) { 130 164 case 12: 131 165 /* first block RGMII or XAUI, use RGMII */ 132 - config_mac(&ndata[0], 133 - PHY_INTERFACE_MODE_RGMII, 134 - gmac0_addr, /* serdes */ 135 - gmac0_addr, /* pcs */ 136 - FMN_STNID_GMACRFR_0, 137 - FMN_STNID_GMAC0_TX0, 138 - xlr_board_fmn_config.bucket_size, 139 - &xlr_board_fmn_config.gmac[0], 140 - 0); 166 + ndata0.phy_interface = PHY_INTERFACE_MODE_RGMII, 167 + ndata0.tx_stnid[0] = FMN_STNID_GMAC0_TX0; 168 + ndata0.phy_addr[0] = 0; 141 169 142 - net_device_init(0, xlr_net_res[0], xlr_gmac_offsets[0], 170 + xlr_net_dev0.num_resources = 2; 171 + 172 + xlr_resource_init(&xlr_net0_res[0], xlr_gmac_offsets[0], 143 173 xlr_gmac_irqs[0]); 144 - platform_device_register(&xlr_net_dev[0]); 174 + platform_device_register(&xlr_net_dev0); 145 175 146 176 /* second block is XAUI, not supported yet */ 147 177 break; 148 178 default: 149 179 /* default XLS config, all ports SGMII */ 180 + ndata0.phy_interface = PHY_INTERFACE_MODE_SGMII; 150 181 for (mac = 0; mac < 4; mac++) { 151 - config_mac(&ndata[mac], 152 - PHY_INTERFACE_MODE_SGMII, 153 - gmac0_addr, /* serdes */ 154 - gmac0_addr, /* pcs */ 155 - FMN_STNID_GMACRFR_0, 156 - FMN_STNID_GMAC0_TX0 + mac, 157 - xlr_board_fmn_config.bucket_size, 158 - &xlr_board_fmn_config.gmac[0], 159 - /* PHY address according to chip/board */ 160 - mac + 0x10); 182 + ndata0.tx_stnid[mac] = FMN_STNID_GMAC0_TX0 + mac; 183 + ndata0.phy_addr[mac] = mac + 0x10; 161 184 162 - net_device_init(mac, xlr_net_res[mac], 185 + xlr_resource_init(&xlr_net0_res[mac * 2], 163 186 xlr_gmac_offsets[mac], 164 187 xlr_gmac_irqs[mac]); 165 - platform_device_register(&xlr_net_dev[mac]); 166 188 } 189 + xlr_net_dev0.num_resources = 8; 190 + platform_device_register(&xlr_net_dev0); 167 191 168 - for (mac = 4; mac < MAX_NUM_XLS_GMAC; mac++) { 169 - config_mac(&ndata[mac], 170 - PHY_INTERFACE_MODE_SGMII, 171 - gmac4_addr, /* serdes */ 172 - gmac4_addr, /* pcs */ 173 - FMN_STNID_GMAC1_FR_0, 174 - FMN_STNID_GMAC1_TX0 + mac - 4, 175 - xlr_board_fmn_config.bucket_size, 176 - &xlr_board_fmn_config.gmac[1], 177 - /* PHY address according to chip/board */ 178 - mac + 0x10); 179 - 180 - net_device_init(mac, xlr_net_res[mac], 181 - xlr_gmac_offsets[mac], 182 - xlr_gmac_irqs[mac]); 183 - platform_device_register(&xlr_net_dev[mac]); 184 - } 192 + xlr_net_dev1 = gmac_controller2_init(gmac0_addr); 193 + platform_device_register(xlr_net_dev1); 185 194 } 186 195 } 187 196 ··· 199 190 int mac; 200 191 201 192 /* assume all GMACs for now */ 202 - for (mac = 0; mac < MAX_NUM_XLR_GMAC; mac++) { 203 - config_mac(&ndata[mac], 204 - PHY_INTERFACE_MODE_RGMII, 205 - 0, 206 - 0, 207 - FMN_STNID_GMACRFR_0, 208 - FMN_STNID_GMAC0_TX0, 209 - xlr_board_fmn_config.bucket_size, 210 - &xlr_board_fmn_config.gmac[0], 211 - mac); 193 + static struct xlr_net_data ndata0 = { 194 + .phy_interface = PHY_INTERFACE_MODE_RGMII, 195 + .serdes_addr = NULL, 196 + .pcs_addr = NULL, 197 + .rfr_station = FMN_STNID_GMACRFR_0, 198 + .bucket_size = xlr_board_fmn_config.bucket_size, 199 + .gmac_fmn_info = &xlr_board_fmn_config.gmac[0], 200 + .gpio_addr = NULL, 201 + }; 212 202 213 - net_device_init(mac, xlr_net_res[mac], xlr_gmac_offsets[mac], 203 + 204 + static struct platform_device xlr_net_dev0 = { 205 + .name = "xlr-net", 206 + .id = 0, 207 + .dev.platform_data = &ndata0, 208 + }; 209 + ndata0.mii_addr = ioremap(CPHYSADDR( 210 + nlm_mmio_base(NETLOGIC_IO_GMAC_0_OFFSET)), 0xfff); 211 + 212 + ndata0.cpu_mask = nlm_current_node()->coremask; 213 + 214 + for (mac = 0; mac < MAX_NUM_XLR_GMAC; mac++) { 215 + ndata0.tx_stnid[mac] = FMN_STNID_GMAC0_TX0 + mac; 216 + ndata0.phy_addr[mac] = mac; 217 + xlr_resource_init(&xlr_net0_res[mac * 2], xlr_gmac_offsets[mac], 214 218 xlr_gmac_irqs[mac]); 215 - platform_device_register(&xlr_net_dev[mac]); 216 219 } 220 + xlr_net_dev0.num_resources = 8; 221 + xlr_net_dev0.resource = xlr_net0_res; 222 + 223 + platform_device_register(&xlr_net_dev0); 217 224 } 218 225 219 226 static int __init xlr_net_init(void) 220 227 { 221 - gmac0_addr = ioremap(CPHYSADDR( 222 - nlm_mmio_base(NETLOGIC_IO_GMAC_0_OFFSET)), 0xfff); 223 - 224 228 if (nlm_chip_is_xls()) 225 229 xls_gmac_init(); 226 230 else
+5 -2
drivers/staging/netlogic/platform_net.h
··· 31 31 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 32 32 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 33 */ 34 + 35 + #define PORTS_PER_CONTROLLER 4 36 + 34 37 struct xlr_net_data { 35 38 int cpu_mask; 36 39 u32 __iomem *mii_addr; ··· 42 39 u32 __iomem *gpio_addr; 43 40 int phy_interface; 44 41 int rfr_station; 45 - int tx_stnid; 42 + int tx_stnid[PORTS_PER_CONTROLLER]; 46 43 int *bucket_size; 47 - int phy_addr; 44 + int phy_addr[PORTS_PER_CONTROLLER]; 48 45 struct xlr_fmn_info *gmac_fmn_info; 49 46 };
+154 -133
drivers/staging/netlogic/xlr_net.c
··· 78 78 xlr_nae_wreg(base_addr, off, (tmp & ~mask) | (val & mask)); 79 79 } 80 80 81 - /* 82 - * Table of net_device pointers indexed by port, this will be used to 83 - * lookup the net_device corresponding to a port by the message ring handler. 84 - * 85 - * Maximum ports in XLR/XLS is 8(8 GMAC on XLS, 4 GMAC + 2 XGMAC on XLR) 86 - */ 87 - static struct net_device *mac_to_ndev[8]; 88 - 89 - static inline struct sk_buff *mac_get_skb_back_ptr(void *addr) 90 - { 91 - struct sk_buff **back_ptr; 92 - 93 - /* 94 - * this function should be used only for newly allocated packets. 95 - * It assumes the first cacheline is for the back pointer related 96 - * book keeping info. 97 - */ 98 - back_ptr = (struct sk_buff **)(addr - MAC_SKB_BACK_PTR_SIZE); 99 - return *back_ptr; 100 - } 101 - 102 - static inline void mac_put_skb_back_ptr(struct sk_buff *skb) 103 - { 104 - struct sk_buff **back_ptr = (struct sk_buff **)skb->data; 105 - 106 - /* 107 - * this function should be used only for newly allocated packets. 108 - * It assumes the first cacheline is for the back pointer related 109 - * book keeping info. 110 - */ 111 - skb_reserve(skb, MAC_SKB_BACK_PTR_SIZE); 112 - *back_ptr = skb; 113 - } 81 + #define MAC_SKB_BACK_PTR_SIZE SMP_CACHE_BYTES 114 82 115 83 static int send_to_rfr_fifo(struct xlr_net_priv *priv, void *addr) 116 84 { ··· 104 136 return ret; 105 137 } 106 138 107 - static inline struct sk_buff *xlr_alloc_skb(void) 139 + static inline unsigned char *xlr_alloc_skb(void) 108 140 { 109 141 struct sk_buff *skb; 142 + int buf_len = sizeof(struct sk_buff *); 143 + unsigned char *skb_data; 110 144 111 145 /* skb->data is cache aligned */ 112 146 skb = alloc_skb(XLR_RX_BUF_SIZE, GFP_ATOMIC); ··· 116 146 pr_err("SKB allocation failed\n"); 117 147 return NULL; 118 148 } 119 - mac_put_skb_back_ptr(skb); 120 - return skb; 149 + skb_data = skb->data; 150 + skb_put(skb, MAC_SKB_BACK_PTR_SIZE); 151 + skb_pull(skb, MAC_SKB_BACK_PTR_SIZE); 152 + memcpy(skb_data, &skb, buf_len); 153 + 154 + return skb->data; 121 155 } 122 156 123 157 static void xlr_net_fmn_handler(int bkt, int src_stnid, int size, 124 158 int code, struct nlm_fmn_msg *msg, void *arg) 125 159 { 126 - struct sk_buff *skb, *skb_new = NULL; 160 + struct sk_buff *skb; 161 + void *skb_data = NULL; 127 162 struct net_device *ndev; 128 163 struct xlr_net_priv *priv; 129 - u64 length, port; 130 - void *addr; 164 + u32 port, length; 165 + unsigned char *addr; 166 + struct xlr_adapter *adapter = (struct xlr_adapter *) arg; 131 167 132 168 length = (msg->msg0 >> 40) & 0x3fff; 133 169 if (length == 0) { 134 170 addr = bus_to_virt(msg->msg0 & 0xffffffffffULL); 135 - dev_kfree_skb_any(addr); 136 - } else if (length) { 137 - addr = bus_to_virt(msg->msg0 & 0xffffffffe0ULL); 171 + addr = addr - MAC_SKB_BACK_PTR_SIZE; 172 + skb = (struct sk_buff *) *(unsigned long *)addr; 173 + dev_kfree_skb_any((struct sk_buff *)addr); 174 + } else { 175 + addr = (unsigned char *) 176 + bus_to_virt(msg->msg0 & 0xffffffffe0ULL); 138 177 length = length - BYTE_OFFSET - MAC_CRC_LEN; 139 - port = msg->msg0 & 0x0f; 140 - if (src_stnid == FMN_STNID_GMAC1) 141 - port = port + 4; 142 - skb = mac_get_skb_back_ptr(addr); 143 - skb->dev = mac_to_ndev[port]; 178 + port = ((int)msg->msg0) & 0x0f; 179 + addr = addr - MAC_SKB_BACK_PTR_SIZE; 180 + skb = (struct sk_buff *) *(unsigned long *)addr; 181 + skb->dev = adapter->netdev[port]; 182 + if (skb->dev == NULL) 183 + return; 144 184 ndev = skb->dev; 145 185 priv = netdev_priv(ndev); 146 186 ··· 161 181 skb->dev->last_rx = jiffies; 162 182 netif_rx(skb); 163 183 /* Fill rx ring */ 164 - skb_new = xlr_alloc_skb(); 165 - if (skb_new) 166 - send_to_rfr_fifo(priv, skb_new->data); 184 + skb_data = xlr_alloc_skb(); 185 + if (skb_data) 186 + send_to_rfr_fifo(priv, skb_data); 167 187 } 168 188 } 169 189 170 - /* Ethtool operation */ 190 + /* 191 + * Ethtool operation 192 + */ 171 193 static int xlr_get_settings(struct net_device *ndev, struct ethtool_cmd *ecmd) 172 194 { 173 195 struct xlr_net_priv *priv = netdev_priv(ndev); ··· 179 197 return -ENODEV; 180 198 return phy_ethtool_gset(phydev, ecmd); 181 199 } 182 - 183 200 static int xlr_set_settings(struct net_device *ndev, struct ethtool_cmd *ecmd) 184 201 { 185 202 struct xlr_net_priv *priv = netdev_priv(ndev); ··· 194 213 .set_settings = xlr_set_settings, 195 214 }; 196 215 197 - /* Net operations */ 216 + 217 + /* 218 + * Net operations 219 + */ 198 220 static int xlr_net_fill_rx_ring(struct net_device *ndev) 199 221 { 200 - struct sk_buff *skb; 222 + void *skb_data; 201 223 struct xlr_net_priv *priv = netdev_priv(ndev); 202 224 int i; 203 225 204 - for (i = 0; i < MAX_FRIN_SPILL/2; i++) { 205 - skb = xlr_alloc_skb(); 206 - if (!skb) 226 + for (i = 0; i < MAX_FRIN_SPILL/4; i++) { 227 + skb_data = xlr_alloc_skb(); 228 + if (!skb_data) { 229 + pr_err("SKB allocation failed\n"); 207 230 return -ENOMEM; 208 - send_to_rfr_fifo(priv, skb->data); 231 + } 232 + send_to_rfr_fifo(priv, skb_data); 209 233 } 210 234 pr_info("Rx ring setup done\n"); 211 235 return 0; ··· 222 236 struct xlr_net_priv *priv = netdev_priv(ndev); 223 237 struct phy_device *phydev = priv->mii_bus->phy_map[priv->phy_addr]; 224 238 239 + 225 240 /* schedule a link state check */ 226 241 phy_start(phydev); 227 242 ··· 231 244 pr_err("Autoneg failed\n"); 232 245 return err; 233 246 } 234 - 235 247 /* Setup the speed from PHY to internal reg*/ 236 248 xlr_set_gmac_speed(priv); 249 + 237 250 netif_tx_start_all_queues(ndev); 251 + 238 252 return 0; 239 253 } 240 254 ··· 287 299 288 300 xlr_make_tx_desc(&msg, virt_to_phys(skb->data), skb); 289 301 flags = nlm_cop2_enable_irqsave(); 290 - ret = nlm_fmn_send(2, 0, priv->nd->tx_stnid, &msg); 302 + ret = nlm_fmn_send(2, 0, priv->tx_stnid, &msg); 291 303 nlm_cop2_disable_irqrestore(flags); 292 304 if (ret) 293 305 dev_kfree_skb_any(skb); ··· 420 432 .ndo_get_stats64 = xlr_get_stats64, 421 433 }; 422 434 423 - /* Gmac init */ 435 + /* 436 + * Gmac init 437 + */ 424 438 static void *xlr_config_spill(struct xlr_net_priv *priv, int reg_start_0, 425 439 int reg_start_1, int reg_size, int size) 426 440 { ··· 528 538 * Setup the Message ring credits, bucket size and other 529 539 * common configuration 530 540 */ 531 - static void xlr_config_common(struct xlr_net_priv *priv) 541 + static int xlr_config_common(struct xlr_net_priv *priv) 532 542 { 533 543 struct xlr_fmn_info *gmac = priv->nd->gmac_fmn_info; 534 544 int start_stn_id = gmac->start_stn_id; 535 545 int end_stn_id = gmac->end_stn_id; 536 546 int *bucket_size = priv->nd->bucket_size; 537 - int i, j; 547 + int i, j, err; 538 548 539 549 /* Setting non-core MsgBktSize(0x321 - 0x325) */ 540 550 for (i = start_stn_id; i <= end_stn_id; i++) { ··· 561 571 xlr_nae_wreg(priv->base_addr, R_DMACR3, 0xffffffff); 562 572 xlr_nae_wreg(priv->base_addr, R_FREEQCARVE, 0); 563 573 564 - xlr_net_fill_rx_ring(priv->ndev); 574 + err = xlr_net_fill_rx_ring(priv->ndev); 575 + if (err) 576 + return err; 565 577 nlm_register_fmn_handler(start_stn_id, end_stn_id, xlr_net_fmn_handler, 566 - NULL); 578 + priv->adapter); 579 + return 0; 567 580 } 568 581 569 582 static void xlr_config_translate_table(struct xlr_net_priv *priv) ··· 767 774 xlr_nae_wreg(priv->gpio_addr, 0x22, 0x7e6802); 768 775 xlr_nae_wreg(priv->gpio_addr, 0x21, 0x7104); 769 776 777 + 770 778 /* enable autoneg - more magic */ 771 779 phy = priv->phy_addr % 4 + 27; 772 780 xlr_phy_write(priv->pcs_addr, phy, 0, 0x1000); ··· 783 789 xlr_sgmii_init(priv); 784 790 785 791 if (phydev->speed != priv->phy_speed) { 786 - pr_info("change %d to %d\n", priv->phy_speed, phydev->speed); 787 792 speed = phydev->speed; 788 793 if (speed == SPEED_1000) { 789 794 /* Set interface to Byte mode */ ··· 824 831 intreg = xlr_nae_rdreg(priv->base_addr, R_INTREG); 825 832 if (phydev->link) { 826 833 if (phydev->speed != priv->phy_speed) { 827 - pr_info("gmac%d : Link up\n", priv->port_id); 828 834 xlr_set_gmac_speed(priv); 835 + pr_info("gmac%d : Link up\n", priv->port_id); 829 836 } 830 837 } else { 831 - pr_info("gmac%d : Link down\n", priv->port_id); 832 838 xlr_set_gmac_speed(priv); 839 + pr_info("gmac%d : Link down\n", priv->port_id); 833 840 } 834 841 } 835 842 ··· 869 876 { 870 877 int err; 871 878 872 - priv->phy_addr = priv->nd->phy_addr; 873 879 priv->mii_bus = mdiobus_alloc(); 874 880 if (!priv->mii_bus) { 875 881 pr_err("mdiobus alloc failed\n"); ··· 888 896 mdiobus_free(priv->mii_bus); 889 897 return -ENOMEM; 890 898 } 899 + 891 900 priv->mii_bus->irq[priv->phy_addr] = priv->ndev->irq; 892 901 893 902 /* Scan only the enabled address */ ··· 959 966 1 << O_RX_CONTROL__RxEnable, 0); 960 967 } 961 968 962 - /* Initialization of gmac */ 969 + /* 970 + * Initialization of gmac 971 + */ 963 972 static int xlr_gmac_init(struct xlr_net_priv *priv, 964 973 struct platform_device *pdev) 965 974 { ··· 970 975 pr_info("Initializing the gmac%d\n", priv->port_id); 971 976 972 977 xlr_port_disable(priv); 978 + 973 979 xlr_nae_wreg(priv->base_addr, R_DESC_PACK_CTRL, 974 980 (1 << O_DESC_PACK_CTRL__MaxEntry) 975 981 | (BYTE_OFFSET << O_DESC_PACK_CTRL__ByteOffset) ··· 999 1003 /* Clear all stats */ 1000 1004 xlr_reg_update(priv->base_addr, R_STATCTRL, 1001 1005 0, 1 << O_STATCTRL__ClrCnt); 1002 - xlr_reg_update(priv->base_addr, R_STATCTRL, 1003 - 1 << O_STATCTRL__ClrCnt, 1 << O_STATCTRL__ClrCnt); 1006 + xlr_reg_update(priv->base_addr, R_STATCTRL, 1 << 2, 1007 + 1 << 2); 1004 1008 return 0; 1005 1009 } 1006 1010 ··· 1009 1013 struct xlr_net_priv *priv = NULL; 1010 1014 struct net_device *ndev; 1011 1015 struct resource *res; 1012 - int mac, err; 1016 + struct xlr_adapter *adapter; 1017 + int err, port; 1013 1018 1014 - mac = pdev->id; 1015 - ndev = alloc_etherdev_mq(sizeof(struct xlr_net_priv), 32); 1016 - if (!ndev) { 1017 - pr_err("Allocation of Ethernet device failed\n"); 1018 - return -ENOMEM; 1019 + pr_info("XLR/XLS Ethernet Driver controller %d\n", pdev->id); 1020 + /* 1021 + * Allocate our adapter data structure and attach it to the device. 1022 + */ 1023 + adapter = (struct xlr_adapter *) 1024 + devm_kzalloc(&pdev->dev, sizeof(adapter), GFP_KERNEL); 1025 + if (!adapter) { 1026 + err = -ENOMEM; 1027 + return err; 1019 1028 } 1020 1029 1021 - priv = netdev_priv(ndev); 1022 - priv->pdev = pdev; 1023 - priv->ndev = ndev; 1024 - priv->port_id = mac; 1025 - priv->nd = (struct xlr_net_data *)pdev->dev.platform_data; 1030 + /* 1031 + * XLR and XLS have 1 and 2 NAE controller respectively 1032 + * Each controller has 4 gmac ports, mapping each controller 1033 + * under one parent device, 4 gmac ports under one device. 1034 + */ 1035 + for (port = 0; port < pdev->num_resources/2; port++) { 1036 + ndev = alloc_etherdev_mq(sizeof(struct xlr_net_priv), 32); 1037 + if (!ndev) { 1038 + pr_err("Allocation of Ethernet device failed\n"); 1039 + return -ENOMEM; 1040 + } 1026 1041 1027 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1028 - if (res == NULL) { 1029 - pr_err("No memory resource for MAC %d\n", mac); 1030 - err = -ENODEV; 1031 - goto err_gmac; 1032 - } 1042 + priv = netdev_priv(ndev); 1043 + priv->pdev = pdev; 1044 + priv->ndev = ndev; 1045 + priv->port_id = (pdev->id * 4) + port; 1046 + priv->nd = (struct xlr_net_data *)pdev->dev.platform_data; 1047 + res = platform_get_resource(pdev, IORESOURCE_MEM, port); 1033 1048 1034 - ndev->base_addr = (unsigned long) devm_ioremap_resource 1035 - (&pdev->dev, res); 1036 - if (IS_ERR_VALUE(ndev->base_addr)) { 1037 - err = ndev->base_addr; 1038 - goto err_gmac; 1039 - } 1049 + if (res == NULL) { 1050 + pr_err("No memory resource for MAC %d\n", 1051 + priv->port_id); 1052 + err = -ENODEV; 1053 + goto err_gmac; 1054 + } 1055 + priv->base_addr = devm_ioremap_resource(&pdev->dev, res); 1056 + if (IS_ERR(priv->base_addr)) { 1057 + err = PTR_ERR(priv->base_addr); 1058 + goto err_gmac; 1059 + } 1060 + priv->adapter = adapter; 1061 + adapter->netdev[port] = ndev; 1040 1062 1041 - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 1042 - if (res == NULL) { 1043 - pr_err("No irq resource for MAC %d\n", mac); 1044 - err = -ENODEV; 1045 - goto err_gmac; 1046 - } 1047 - ndev->irq = res->start; 1063 + res = platform_get_resource(pdev, IORESOURCE_IRQ, port); 1064 + if (res == NULL) { 1065 + pr_err("No irq resource for MAC %d\n", priv->port_id); 1066 + err = -ENODEV; 1067 + goto err_gmac; 1068 + } 1048 1069 1049 - priv->mii_addr = priv->nd->mii_addr; 1050 - priv->serdes_addr = priv->nd->serdes_addr; 1051 - priv->pcs_addr = priv->nd->pcs_addr; 1052 - priv->gpio_addr = priv->nd->gpio_addr; 1053 - priv->base_addr = (u32 *) ndev->base_addr; 1070 + ndev->irq = res->start; 1054 1071 1055 - mac_to_ndev[mac] = ndev; 1056 - ndev->netdev_ops = &xlr_netdev_ops; 1057 - ndev->watchdog_timeo = HZ; 1072 + priv->phy_addr = priv->nd->phy_addr[port]; 1073 + priv->tx_stnid = priv->nd->tx_stnid[port]; 1074 + priv->mii_addr = priv->nd->mii_addr; 1075 + priv->serdes_addr = priv->nd->serdes_addr; 1076 + priv->pcs_addr = priv->nd->pcs_addr; 1077 + priv->gpio_addr = priv->nd->gpio_addr; 1058 1078 1059 - /* Setup Mac address and Rx mode */ 1060 - eth_hw_addr_random(ndev); 1061 - xlr_hw_set_mac_addr(ndev); 1062 - xlr_set_rx_mode(ndev); 1079 + ndev->netdev_ops = &xlr_netdev_ops; 1080 + ndev->watchdog_timeo = HZ; 1063 1081 1064 - priv->num_rx_desc += MAX_NUM_DESC_SPILL; 1065 - ndev->ethtool_ops = &xlr_ethtool_ops; 1066 - SET_NETDEV_DEV(ndev, &pdev->dev); 1082 + /* Setup Mac address and Rx mode */ 1083 + eth_hw_addr_random(ndev); 1084 + xlr_hw_set_mac_addr(ndev); 1085 + xlr_set_rx_mode(ndev); 1067 1086 1068 - /* Common registers, do one time initialization */ 1069 - if (mac == 0 || mac == 4) { 1087 + priv->num_rx_desc += MAX_NUM_DESC_SPILL; 1088 + ndev->ethtool_ops = &xlr_ethtool_ops; 1089 + SET_NETDEV_DEV(ndev, &pdev->dev); 1090 + 1070 1091 xlr_config_fifo_spill_area(priv); 1071 1092 /* Configure PDE to Round-Robin pkt distribution */ 1072 1093 xlr_config_pde(priv); 1073 1094 xlr_config_parser(priv); 1074 - } 1075 - /* Call init with respect to port */ 1076 - if (strcmp(res->name, "gmac") == 0) { 1077 - err = xlr_gmac_init(priv, pdev); 1078 - if (err) { 1079 - pr_err("gmac%d init failed\n", mac); 1080 - goto err_gmac; 1095 + 1096 + /* Call init with respect to port */ 1097 + if (strcmp(res->name, "gmac") == 0) { 1098 + err = xlr_gmac_init(priv, pdev); 1099 + if (err) { 1100 + pr_err("gmac%d init failed\n", priv->port_id); 1101 + goto err_gmac; 1102 + } 1081 1103 } 1104 + 1105 + if (priv->port_id == 0 || priv->port_id == 4) { 1106 + err = xlr_config_common(priv); 1107 + if (err) 1108 + goto err_netdev; 1109 + } 1110 + 1111 + err = register_netdev(ndev); 1112 + if (err) { 1113 + pr_err("Registering netdev failed for gmac%d\n", 1114 + priv->port_id); 1115 + goto err_netdev; 1116 + } 1117 + platform_set_drvdata(pdev, priv); 1082 1118 } 1083 1119 1084 - if (mac == 0 || mac == 4) 1085 - xlr_config_common(priv); 1086 - 1087 - err = register_netdev(ndev); 1088 - if (err) 1089 - goto err_netdev; 1090 - platform_set_drvdata(pdev, priv); 1091 1120 return 0; 1092 1121 1093 1122 err_netdev:
+7 -1
drivers/staging/netlogic/xlr_net.h
··· 1069 1069 CARRY_REG_2 = 0x4d, 1070 1070 }; 1071 1071 1072 + struct xlr_adapter { 1073 + struct net_device *netdev[4]; 1074 + }; 1075 + 1072 1076 struct xlr_net_priv { 1073 1077 u32 __iomem *base_addr; 1074 1078 struct net_device *ndev; 1079 + struct xlr_adapter *adapter; 1075 1080 struct mii_bus *mii_bus; 1076 1081 int num_rx_desc; 1077 1082 int phy_addr; /* PHY addr on MDIO bus */ 1078 1083 int pcs_id; /* PCS id on MDIO bus */ 1079 1084 int port_id; /* Port(gmac/xgmac) number, i.e 0-7 */ 1085 + int tx_stnid; 1080 1086 u32 __iomem *mii_addr; 1081 1087 u32 __iomem *serdes_addr; 1082 1088 u32 __iomem *pcs_addr; ··· 1102 1096 u64 *class_3_spill; 1103 1097 }; 1104 1098 1105 - void xlr_set_gmac_speed(struct xlr_net_priv *priv); 1099 + extern void xlr_set_gmac_speed(struct xlr_net_priv *priv);