0001
0002
0003
0004
0005
0006
0007
0008
0009 #define pr_fmt(fmt) "ax88796c: " fmt
0010
0011 #include "ax88796c_main.h"
0012 #include "ax88796c_ioctl.h"
0013
0014 #include <linux/bitmap.h>
0015 #include <linux/etherdevice.h>
0016 #include <linux/iopoll.h>
0017 #include <linux/lockdep.h>
0018 #include <linux/mdio.h>
0019 #include <linux/minmax.h>
0020 #include <linux/module.h>
0021 #include <linux/netdevice.h>
0022 #include <linux/of.h>
0023 #include <linux/phy.h>
0024 #include <linux/skbuff.h>
0025 #include <linux/spi/spi.h>
0026
0027 static int comp = IS_ENABLED(CONFIG_SPI_AX88796C_COMPRESSION);
0028 static int msg_enable = NETIF_MSG_PROBE |
0029 NETIF_MSG_LINK |
0030 NETIF_MSG_RX_ERR |
0031 NETIF_MSG_TX_ERR;
0032
0033 static const char *no_regs_list = "80018001,e1918001,8001a001,fc0d0000";
0034 unsigned long ax88796c_no_regs_mask[AX88796C_REGDUMP_LEN / (sizeof(unsigned long) * 8)];
0035
0036 module_param(msg_enable, int, 0444);
0037 MODULE_PARM_DESC(msg_enable, "Message mask (see linux/netdevice.h for bitmap)");
0038
0039 static int ax88796c_soft_reset(struct ax88796c_device *ax_local)
0040 {
0041 u16 temp;
0042 int ret;
0043
0044 lockdep_assert_held(&ax_local->spi_lock);
0045
0046 AX_WRITE(&ax_local->ax_spi, PSR_RESET, P0_PSR);
0047 AX_WRITE(&ax_local->ax_spi, PSR_RESET_CLR, P0_PSR);
0048
0049 ret = read_poll_timeout(AX_READ, ret,
0050 (ret & PSR_DEV_READY),
0051 0, jiffies_to_usecs(160 * HZ / 1000), false,
0052 &ax_local->ax_spi, P0_PSR);
0053 if (ret)
0054 return ret;
0055
0056 temp = AX_READ(&ax_local->ax_spi, P4_SPICR);
0057 if (ax_local->priv_flags & AX_CAP_COMP) {
0058 AX_WRITE(&ax_local->ax_spi,
0059 (temp | SPICR_RCEN | SPICR_QCEN), P4_SPICR);
0060 ax_local->ax_spi.comp = 1;
0061 } else {
0062 AX_WRITE(&ax_local->ax_spi,
0063 (temp & ~(SPICR_RCEN | SPICR_QCEN)), P4_SPICR);
0064 ax_local->ax_spi.comp = 0;
0065 }
0066
0067 return 0;
0068 }
0069
0070 static int ax88796c_reload_eeprom(struct ax88796c_device *ax_local)
0071 {
0072 int ret;
0073
0074 lockdep_assert_held(&ax_local->spi_lock);
0075
0076 AX_WRITE(&ax_local->ax_spi, EECR_RELOAD, P3_EECR);
0077
0078 ret = read_poll_timeout(AX_READ, ret,
0079 (ret & PSR_DEV_READY),
0080 0, jiffies_to_usecs(2 * HZ / 1000), false,
0081 &ax_local->ax_spi, P0_PSR);
0082 if (ret) {
0083 dev_err(&ax_local->spi->dev,
0084 "timeout waiting for reload eeprom\n");
0085 return ret;
0086 }
0087
0088 return 0;
0089 }
0090
0091 static void ax88796c_set_hw_multicast(struct net_device *ndev)
0092 {
0093 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0094 int mc_count = netdev_mc_count(ndev);
0095 u16 rx_ctl = RXCR_AB;
0096
0097 lockdep_assert_held(&ax_local->spi_lock);
0098
0099 memset(ax_local->multi_filter, 0, AX_MCAST_FILTER_SIZE);
0100
0101 if (ndev->flags & IFF_PROMISC) {
0102 rx_ctl |= RXCR_PRO;
0103
0104 } else if (ndev->flags & IFF_ALLMULTI || mc_count > AX_MAX_MCAST) {
0105 rx_ctl |= RXCR_AMALL;
0106
0107 } else if (mc_count == 0) {
0108
0109 } else {
0110 u32 crc_bits;
0111 int i;
0112 struct netdev_hw_addr *ha;
0113
0114 netdev_for_each_mc_addr(ha, ndev) {
0115 crc_bits = ether_crc(ETH_ALEN, ha->addr);
0116 ax_local->multi_filter[crc_bits >> 29] |=
0117 (1 << ((crc_bits >> 26) & 7));
0118 }
0119
0120 for (i = 0; i < 4; i++) {
0121 AX_WRITE(&ax_local->ax_spi,
0122 ((ax_local->multi_filter[i * 2 + 1] << 8) |
0123 ax_local->multi_filter[i * 2]), P3_MFAR(i));
0124 }
0125 }
0126
0127 AX_WRITE(&ax_local->ax_spi, rx_ctl, P2_RXCR);
0128 }
0129
0130 static void ax88796c_set_mac_addr(struct net_device *ndev)
0131 {
0132 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0133
0134 lockdep_assert_held(&ax_local->spi_lock);
0135
0136 AX_WRITE(&ax_local->ax_spi, ((u16)(ndev->dev_addr[4] << 8) |
0137 (u16)ndev->dev_addr[5]), P3_MACASR0);
0138 AX_WRITE(&ax_local->ax_spi, ((u16)(ndev->dev_addr[2] << 8) |
0139 (u16)ndev->dev_addr[3]), P3_MACASR1);
0140 AX_WRITE(&ax_local->ax_spi, ((u16)(ndev->dev_addr[0] << 8) |
0141 (u16)ndev->dev_addr[1]), P3_MACASR2);
0142 }
0143
0144 static void ax88796c_load_mac_addr(struct net_device *ndev)
0145 {
0146 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0147 u8 addr[ETH_ALEN];
0148 u16 temp;
0149
0150 lockdep_assert_held(&ax_local->spi_lock);
0151
0152
0153 if (!platform_get_ethdev_address(&ax_local->spi->dev, ndev) &&
0154 is_valid_ether_addr(ndev->dev_addr)) {
0155 if (netif_msg_probe(ax_local))
0156 dev_info(&ax_local->spi->dev,
0157 "MAC address read from device tree\n");
0158 return;
0159 }
0160
0161
0162 temp = AX_READ(&ax_local->ax_spi, P3_MACASR0);
0163 addr[5] = (u8)temp;
0164 addr[4] = (u8)(temp >> 8);
0165
0166 temp = AX_READ(&ax_local->ax_spi, P3_MACASR1);
0167 addr[3] = (u8)temp;
0168 addr[2] = (u8)(temp >> 8);
0169
0170 temp = AX_READ(&ax_local->ax_spi, P3_MACASR2);
0171 addr[1] = (u8)temp;
0172 addr[0] = (u8)(temp >> 8);
0173
0174 if (is_valid_ether_addr(addr)) {
0175 eth_hw_addr_set(ndev, addr);
0176 if (netif_msg_probe(ax_local))
0177 dev_info(&ax_local->spi->dev,
0178 "MAC address read from ASIX chip\n");
0179 return;
0180 }
0181
0182
0183 if (netif_msg_probe(ax_local))
0184 dev_info(&ax_local->spi->dev, "Use random MAC address\n");
0185 eth_hw_addr_random(ndev);
0186 }
0187
0188 static void ax88796c_proc_tx_hdr(struct tx_pkt_info *info, u8 ip_summed)
0189 {
0190 u16 pkt_len_bar = (~info->pkt_len & TX_HDR_SOP_PKTLENBAR);
0191
0192
0193 info->sop.flags_len = info->pkt_len |
0194 ((ip_summed == CHECKSUM_NONE) ||
0195 (ip_summed == CHECKSUM_UNNECESSARY) ? TX_HDR_SOP_DICF : 0);
0196
0197 info->sop.seq_lenbar = ((info->seq_num << 11) & TX_HDR_SOP_SEQNUM)
0198 | pkt_len_bar;
0199 cpu_to_be16s(&info->sop.flags_len);
0200 cpu_to_be16s(&info->sop.seq_lenbar);
0201
0202
0203 info->seg.flags_seqnum_seglen = TX_HDR_SEG_FS | TX_HDR_SEG_LS
0204 | info->pkt_len;
0205
0206 info->seg.eo_so_seglenbar = pkt_len_bar;
0207
0208 cpu_to_be16s(&info->seg.flags_seqnum_seglen);
0209 cpu_to_be16s(&info->seg.eo_so_seglenbar);
0210
0211
0212 info->eop.seq_len = ((info->seq_num << 11) &
0213 TX_HDR_EOP_SEQNUM) | info->pkt_len;
0214 info->eop.seqbar_lenbar = ((~info->seq_num << 11) &
0215 TX_HDR_EOP_SEQNUMBAR) | pkt_len_bar;
0216
0217 cpu_to_be16s(&info->eop.seq_len);
0218 cpu_to_be16s(&info->eop.seqbar_lenbar);
0219 }
0220
0221 static int
0222 ax88796c_check_free_pages(struct ax88796c_device *ax_local, u8 need_pages)
0223 {
0224 u8 free_pages;
0225 u16 tmp;
0226
0227 lockdep_assert_held(&ax_local->spi_lock);
0228
0229 free_pages = AX_READ(&ax_local->ax_spi, P0_TFBFCR) & TX_FREEBUF_MASK;
0230 if (free_pages < need_pages) {
0231
0232 tmp = AX_READ(&ax_local->ax_spi, P0_TFBFCR)
0233 & TFBFCR_SCHE_FREE_PAGE;
0234 AX_WRITE(&ax_local->ax_spi, tmp | TFBFCR_TX_PAGE_SET |
0235 TFBFCR_SET_FREE_PAGE(need_pages),
0236 P0_TFBFCR);
0237 return -ENOMEM;
0238 }
0239
0240 return 0;
0241 }
0242
0243 static struct sk_buff *
0244 ax88796c_tx_fixup(struct net_device *ndev, struct sk_buff_head *q)
0245 {
0246 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0247 u8 spi_len = ax_local->ax_spi.comp ? 1 : 4;
0248 struct sk_buff *skb;
0249 struct tx_pkt_info info;
0250 struct skb_data *entry;
0251 u16 pkt_len;
0252 u8 padlen, seq_num;
0253 u8 need_pages;
0254 int headroom;
0255 int tailroom;
0256
0257 if (skb_queue_empty(q))
0258 return NULL;
0259
0260 skb = skb_peek(q);
0261 pkt_len = skb->len;
0262 need_pages = (pkt_len + TX_OVERHEAD + 127) >> 7;
0263 if (ax88796c_check_free_pages(ax_local, need_pages) != 0)
0264 return NULL;
0265
0266 headroom = skb_headroom(skb);
0267 tailroom = skb_tailroom(skb);
0268 padlen = round_up(pkt_len, 4) - pkt_len;
0269 seq_num = ++ax_local->seq_num & 0x1F;
0270
0271 info.pkt_len = pkt_len;
0272
0273 if (skb_cloned(skb) ||
0274 (headroom < (TX_OVERHEAD + spi_len)) ||
0275 (tailroom < (padlen + TX_EOP_SIZE))) {
0276 size_t h = max((TX_OVERHEAD + spi_len) - headroom, 0);
0277 size_t t = max((padlen + TX_EOP_SIZE) - tailroom, 0);
0278
0279 if (pskb_expand_head(skb, h, t, GFP_KERNEL))
0280 return NULL;
0281 }
0282
0283 info.seq_num = seq_num;
0284 ax88796c_proc_tx_hdr(&info, skb->ip_summed);
0285
0286
0287 memcpy(skb_push(skb, TX_OVERHEAD), &info.sop, TX_OVERHEAD);
0288
0289
0290 memcpy(skb_push(skb, spi_len), ax88796c_tx_cmd_buf, spi_len);
0291
0292
0293 skb_put(skb, padlen);
0294
0295
0296 memcpy(skb_put(skb, TX_EOP_SIZE), &info.eop, TX_EOP_SIZE);
0297
0298 skb_unlink(skb, q);
0299
0300 entry = (struct skb_data *)skb->cb;
0301 memset(entry, 0, sizeof(*entry));
0302 entry->len = pkt_len;
0303
0304 if (netif_msg_pktdata(ax_local)) {
0305 char pfx[IFNAMSIZ + 7];
0306
0307 snprintf(pfx, sizeof(pfx), "%s: ", ndev->name);
0308
0309 netdev_info(ndev, "TX packet len %d, total len %d, seq %d\n",
0310 pkt_len, skb->len, seq_num);
0311
0312 netdev_info(ndev, " SPI Header:\n");
0313 print_hex_dump(KERN_INFO, pfx, DUMP_PREFIX_OFFSET, 16, 1,
0314 skb->data, 4, 0);
0315
0316 netdev_info(ndev, " TX SOP:\n");
0317 print_hex_dump(KERN_INFO, pfx, DUMP_PREFIX_OFFSET, 16, 1,
0318 skb->data + 4, TX_OVERHEAD, 0);
0319
0320 netdev_info(ndev, " TX packet:\n");
0321 print_hex_dump(KERN_INFO, pfx, DUMP_PREFIX_OFFSET, 16, 1,
0322 skb->data + 4 + TX_OVERHEAD,
0323 skb->len - TX_EOP_SIZE - 4 - TX_OVERHEAD, 0);
0324
0325 netdev_info(ndev, " TX EOP:\n");
0326 print_hex_dump(KERN_INFO, pfx, DUMP_PREFIX_OFFSET, 16, 1,
0327 skb->data + skb->len - 4, 4, 0);
0328 }
0329
0330 return skb;
0331 }
0332
0333 static int ax88796c_hard_xmit(struct ax88796c_device *ax_local)
0334 {
0335 struct ax88796c_pcpu_stats *stats;
0336 struct sk_buff *tx_skb;
0337 struct skb_data *entry;
0338 unsigned long flags;
0339
0340 lockdep_assert_held(&ax_local->spi_lock);
0341
0342 stats = this_cpu_ptr(ax_local->stats);
0343 tx_skb = ax88796c_tx_fixup(ax_local->ndev, &ax_local->tx_wait_q);
0344
0345 if (!tx_skb) {
0346 this_cpu_inc(ax_local->stats->tx_dropped);
0347 return 0;
0348 }
0349 entry = (struct skb_data *)tx_skb->cb;
0350
0351 AX_WRITE(&ax_local->ax_spi,
0352 (TSNR_TXB_START | TSNR_PKT_CNT(1)), P0_TSNR);
0353
0354 axspi_write_txq(&ax_local->ax_spi, tx_skb->data, tx_skb->len);
0355
0356 if (((AX_READ(&ax_local->ax_spi, P0_TSNR) & TXNR_TXB_IDLE) == 0) ||
0357 ((ISR_TXERR & AX_READ(&ax_local->ax_spi, P0_ISR)) != 0)) {
0358
0359 AX_WRITE(&ax_local->ax_spi, ISR_TXERR, P0_ISR);
0360
0361 this_cpu_inc(ax_local->stats->tx_dropped);
0362
0363 if (net_ratelimit())
0364 netif_err(ax_local, tx_err, ax_local->ndev,
0365 "TX FIFO error, re-initialize the TX bridge\n");
0366
0367
0368 AX_WRITE(&ax_local->ax_spi, TXNR_TXB_REINIT |
0369 AX_READ(&ax_local->ax_spi, P0_TSNR), P0_TSNR);
0370 ax_local->seq_num = 0;
0371 } else {
0372 flags = u64_stats_update_begin_irqsave(&stats->syncp);
0373 u64_stats_inc(&stats->tx_packets);
0374 u64_stats_add(&stats->tx_bytes, entry->len);
0375 u64_stats_update_end_irqrestore(&stats->syncp, flags);
0376 }
0377
0378 entry->state = tx_done;
0379 dev_kfree_skb(tx_skb);
0380
0381 return 1;
0382 }
0383
0384 static int
0385 ax88796c_start_xmit(struct sk_buff *skb, struct net_device *ndev)
0386 {
0387 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0388
0389 skb_queue_tail(&ax_local->tx_wait_q, skb);
0390 if (skb_queue_len(&ax_local->tx_wait_q) > TX_QUEUE_HIGH_WATER)
0391 netif_stop_queue(ndev);
0392
0393 set_bit(EVENT_TX, &ax_local->flags);
0394 schedule_work(&ax_local->ax_work);
0395
0396 return NETDEV_TX_OK;
0397 }
0398
0399 static void
0400 ax88796c_skb_return(struct ax88796c_device *ax_local,
0401 struct sk_buff *skb, struct rx_header *rxhdr)
0402 {
0403 struct net_device *ndev = ax_local->ndev;
0404 struct ax88796c_pcpu_stats *stats;
0405 unsigned long flags;
0406 int status;
0407
0408 stats = this_cpu_ptr(ax_local->stats);
0409
0410 do {
0411 if (!(ndev->features & NETIF_F_RXCSUM))
0412 break;
0413
0414
0415 if ((rxhdr->flags & RX_HDR3_L3_ERR) ||
0416 (rxhdr->flags & RX_HDR3_L4_ERR))
0417 break;
0418
0419
0420 if ((rxhdr->flags & RX_HDR3_L4_TYPE_TCP) ||
0421 (rxhdr->flags & RX_HDR3_L4_TYPE_UDP))
0422 skb->ip_summed = CHECKSUM_UNNECESSARY;
0423 } while (0);
0424
0425 flags = u64_stats_update_begin_irqsave(&stats->syncp);
0426 u64_stats_inc(&stats->rx_packets);
0427 u64_stats_add(&stats->rx_bytes, skb->len);
0428 u64_stats_update_end_irqrestore(&stats->syncp, flags);
0429
0430 skb->dev = ndev;
0431 skb->protocol = eth_type_trans(skb, ax_local->ndev);
0432
0433 netif_info(ax_local, rx_status, ndev, "< rx, len %zu, type 0x%x\n",
0434 skb->len + sizeof(struct ethhdr), skb->protocol);
0435
0436 status = netif_rx(skb);
0437 if (status != NET_RX_SUCCESS && net_ratelimit())
0438 netif_info(ax_local, rx_err, ndev,
0439 "netif_rx status %d\n", status);
0440 }
0441
0442 static void
0443 ax88796c_rx_fixup(struct ax88796c_device *ax_local, struct sk_buff *rx_skb)
0444 {
0445 struct rx_header *rxhdr = (struct rx_header *)rx_skb->data;
0446 struct net_device *ndev = ax_local->ndev;
0447 u16 len;
0448
0449 be16_to_cpus(&rxhdr->flags_len);
0450 be16_to_cpus(&rxhdr->seq_lenbar);
0451 be16_to_cpus(&rxhdr->flags);
0452
0453 if ((rxhdr->flags_len & RX_HDR1_PKT_LEN) !=
0454 (~rxhdr->seq_lenbar & 0x7FF)) {
0455 netif_err(ax_local, rx_err, ndev, "Header error\n");
0456
0457 this_cpu_inc(ax_local->stats->rx_frame_errors);
0458 kfree_skb(rx_skb);
0459 return;
0460 }
0461
0462 if ((rxhdr->flags_len & RX_HDR1_MII_ERR) ||
0463 (rxhdr->flags_len & RX_HDR1_CRC_ERR)) {
0464 netif_err(ax_local, rx_err, ndev, "CRC or MII error\n");
0465
0466 this_cpu_inc(ax_local->stats->rx_crc_errors);
0467 kfree_skb(rx_skb);
0468 return;
0469 }
0470
0471 len = rxhdr->flags_len & RX_HDR1_PKT_LEN;
0472 if (netif_msg_pktdata(ax_local)) {
0473 char pfx[IFNAMSIZ + 7];
0474
0475 snprintf(pfx, sizeof(pfx), "%s: ", ndev->name);
0476 netdev_info(ndev, "RX data, total len %d, packet len %d\n",
0477 rx_skb->len, len);
0478
0479 netdev_info(ndev, " Dump RX packet header:");
0480 print_hex_dump(KERN_INFO, pfx, DUMP_PREFIX_OFFSET, 16, 1,
0481 rx_skb->data, sizeof(*rxhdr), 0);
0482
0483 netdev_info(ndev, " Dump RX packet:");
0484 print_hex_dump(KERN_INFO, pfx, DUMP_PREFIX_OFFSET, 16, 1,
0485 rx_skb->data + sizeof(*rxhdr), len, 0);
0486 }
0487
0488 skb_pull(rx_skb, sizeof(*rxhdr));
0489 pskb_trim(rx_skb, len);
0490
0491 ax88796c_skb_return(ax_local, rx_skb, rxhdr);
0492 }
0493
0494 static int ax88796c_receive(struct net_device *ndev)
0495 {
0496 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0497 struct skb_data *entry;
0498 u16 w_count, pkt_len;
0499 struct sk_buff *skb;
0500 u8 pkt_cnt;
0501
0502 lockdep_assert_held(&ax_local->spi_lock);
0503
0504
0505 AX_WRITE(&ax_local->ax_spi, AX_READ(&ax_local->ax_spi, P0_RTWCR)
0506 | RTWCR_RX_LATCH, P0_RTWCR);
0507
0508 pkt_cnt = AX_READ(&ax_local->ax_spi, P0_RXBCR2) & RXBCR2_PKT_MASK;
0509 if (!pkt_cnt)
0510 return 0;
0511
0512 pkt_len = AX_READ(&ax_local->ax_spi, P0_RCPHR) & 0x7FF;
0513
0514 w_count = round_up(pkt_len + 6, 4) >> 1;
0515
0516 skb = netdev_alloc_skb(ndev, w_count * 2);
0517 if (!skb) {
0518 AX_WRITE(&ax_local->ax_spi, RXBCR1_RXB_DISCARD, P0_RXBCR1);
0519 this_cpu_inc(ax_local->stats->rx_dropped);
0520 return 0;
0521 }
0522 entry = (struct skb_data *)skb->cb;
0523
0524 AX_WRITE(&ax_local->ax_spi, RXBCR1_RXB_START | w_count, P0_RXBCR1);
0525
0526 axspi_read_rxq(&ax_local->ax_spi,
0527 skb_put(skb, w_count * 2), skb->len);
0528
0529
0530 if ((AX_READ(&ax_local->ax_spi, P0_RXBCR2) & RXBCR2_RXB_IDLE) == 0) {
0531 if (net_ratelimit())
0532 netif_err(ax_local, rx_err, ndev,
0533 "Rx Bridge is not idle\n");
0534 AX_WRITE(&ax_local->ax_spi, RXBCR2_RXB_REINIT, P0_RXBCR2);
0535
0536 entry->state = rx_err;
0537 } else {
0538 entry->state = rx_done;
0539 }
0540
0541 AX_WRITE(&ax_local->ax_spi, ISR_RXPKT, P0_ISR);
0542
0543 ax88796c_rx_fixup(ax_local, skb);
0544
0545 return 1;
0546 }
0547
0548 static int ax88796c_process_isr(struct ax88796c_device *ax_local)
0549 {
0550 struct net_device *ndev = ax_local->ndev;
0551 int todo = 0;
0552 u16 isr;
0553
0554 lockdep_assert_held(&ax_local->spi_lock);
0555
0556 isr = AX_READ(&ax_local->ax_spi, P0_ISR);
0557 AX_WRITE(&ax_local->ax_spi, isr, P0_ISR);
0558
0559 netif_dbg(ax_local, intr, ndev, " ISR 0x%04x\n", isr);
0560
0561 if (isr & ISR_TXERR) {
0562 netif_dbg(ax_local, intr, ndev, " TXERR interrupt\n");
0563 AX_WRITE(&ax_local->ax_spi, TXNR_TXB_REINIT, P0_TSNR);
0564 ax_local->seq_num = 0x1f;
0565 }
0566
0567 if (isr & ISR_TXPAGES) {
0568 netif_dbg(ax_local, intr, ndev, " TXPAGES interrupt\n");
0569 set_bit(EVENT_TX, &ax_local->flags);
0570 }
0571
0572 if (isr & ISR_LINK) {
0573 netif_dbg(ax_local, intr, ndev, " Link change interrupt\n");
0574 phy_mac_interrupt(ax_local->ndev->phydev);
0575 }
0576
0577 if (isr & ISR_RXPKT) {
0578 netif_dbg(ax_local, intr, ndev, " RX interrupt\n");
0579 todo = ax88796c_receive(ax_local->ndev);
0580 }
0581
0582 return todo;
0583 }
0584
0585 static irqreturn_t ax88796c_interrupt(int irq, void *dev_instance)
0586 {
0587 struct ax88796c_device *ax_local;
0588 struct net_device *ndev;
0589
0590 ndev = dev_instance;
0591 if (!ndev) {
0592 pr_err("irq %d for unknown device.\n", irq);
0593 return IRQ_RETVAL(0);
0594 }
0595 ax_local = to_ax88796c_device(ndev);
0596
0597 disable_irq_nosync(irq);
0598
0599 netif_dbg(ax_local, intr, ndev, "Interrupt occurred\n");
0600
0601 set_bit(EVENT_INTR, &ax_local->flags);
0602 schedule_work(&ax_local->ax_work);
0603
0604 return IRQ_HANDLED;
0605 }
0606
0607 static void ax88796c_work(struct work_struct *work)
0608 {
0609 struct ax88796c_device *ax_local =
0610 container_of(work, struct ax88796c_device, ax_work);
0611
0612 mutex_lock(&ax_local->spi_lock);
0613
0614 if (test_bit(EVENT_SET_MULTI, &ax_local->flags)) {
0615 ax88796c_set_hw_multicast(ax_local->ndev);
0616 clear_bit(EVENT_SET_MULTI, &ax_local->flags);
0617 }
0618
0619 if (test_bit(EVENT_INTR, &ax_local->flags)) {
0620 AX_WRITE(&ax_local->ax_spi, IMR_MASKALL, P0_IMR);
0621
0622 while (ax88796c_process_isr(ax_local))
0623 ;
0624
0625 clear_bit(EVENT_INTR, &ax_local->flags);
0626
0627 AX_WRITE(&ax_local->ax_spi, IMR_DEFAULT, P0_IMR);
0628
0629 enable_irq(ax_local->ndev->irq);
0630 }
0631
0632 if (test_bit(EVENT_TX, &ax_local->flags)) {
0633 while (skb_queue_len(&ax_local->tx_wait_q)) {
0634 if (!ax88796c_hard_xmit(ax_local))
0635 break;
0636 }
0637
0638 clear_bit(EVENT_TX, &ax_local->flags);
0639
0640 if (netif_queue_stopped(ax_local->ndev) &&
0641 (skb_queue_len(&ax_local->tx_wait_q) < TX_QUEUE_LOW_WATER))
0642 netif_wake_queue(ax_local->ndev);
0643 }
0644
0645 mutex_unlock(&ax_local->spi_lock);
0646 }
0647
0648 static void ax88796c_get_stats64(struct net_device *ndev,
0649 struct rtnl_link_stats64 *stats)
0650 {
0651 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0652 u32 rx_frame_errors = 0, rx_crc_errors = 0;
0653 u32 rx_dropped = 0, tx_dropped = 0;
0654 unsigned int start;
0655 int cpu;
0656
0657 for_each_possible_cpu(cpu) {
0658 struct ax88796c_pcpu_stats *s;
0659 u64 rx_packets, rx_bytes;
0660 u64 tx_packets, tx_bytes;
0661
0662 s = per_cpu_ptr(ax_local->stats, cpu);
0663
0664 do {
0665 start = u64_stats_fetch_begin_irq(&s->syncp);
0666 rx_packets = u64_stats_read(&s->rx_packets);
0667 rx_bytes = u64_stats_read(&s->rx_bytes);
0668 tx_packets = u64_stats_read(&s->tx_packets);
0669 tx_bytes = u64_stats_read(&s->tx_bytes);
0670 } while (u64_stats_fetch_retry_irq(&s->syncp, start));
0671
0672 stats->rx_packets += rx_packets;
0673 stats->rx_bytes += rx_bytes;
0674 stats->tx_packets += tx_packets;
0675 stats->tx_bytes += tx_bytes;
0676
0677 rx_dropped += s->rx_dropped;
0678 tx_dropped += s->tx_dropped;
0679 rx_frame_errors += s->rx_frame_errors;
0680 rx_crc_errors += s->rx_crc_errors;
0681 }
0682
0683 stats->rx_dropped = rx_dropped;
0684 stats->tx_dropped = tx_dropped;
0685 stats->rx_frame_errors = rx_frame_errors;
0686 stats->rx_crc_errors = rx_crc_errors;
0687 }
0688
0689 static void ax88796c_set_mac(struct ax88796c_device *ax_local)
0690 {
0691 u16 maccr;
0692
0693 maccr = (ax_local->link) ? MACCR_RXEN : 0;
0694
0695 switch (ax_local->speed) {
0696 case SPEED_100:
0697 maccr |= MACCR_SPEED_100;
0698 break;
0699 case SPEED_10:
0700 case SPEED_UNKNOWN:
0701 break;
0702 default:
0703 return;
0704 }
0705
0706 switch (ax_local->duplex) {
0707 case DUPLEX_FULL:
0708 maccr |= MACCR_SPEED_100;
0709 break;
0710 case DUPLEX_HALF:
0711 case DUPLEX_UNKNOWN:
0712 break;
0713 default:
0714 return;
0715 }
0716
0717 if (ax_local->flowctrl & AX_FC_ANEG &&
0718 ax_local->phydev->autoneg) {
0719 maccr |= ax_local->pause ? MACCR_RXFC_ENABLE : 0;
0720 maccr |= !ax_local->pause != !ax_local->asym_pause ?
0721 MACCR_TXFC_ENABLE : 0;
0722 } else {
0723 maccr |= (ax_local->flowctrl & AX_FC_RX) ? MACCR_RXFC_ENABLE : 0;
0724 maccr |= (ax_local->flowctrl & AX_FC_TX) ? MACCR_TXFC_ENABLE : 0;
0725 }
0726
0727 mutex_lock(&ax_local->spi_lock);
0728
0729 maccr |= AX_READ(&ax_local->ax_spi, P0_MACCR) &
0730 ~(MACCR_DUPLEX_FULL | MACCR_SPEED_100 |
0731 MACCR_TXFC_ENABLE | MACCR_RXFC_ENABLE);
0732 AX_WRITE(&ax_local->ax_spi, maccr, P0_MACCR);
0733
0734 mutex_unlock(&ax_local->spi_lock);
0735 }
0736
0737 static void ax88796c_handle_link_change(struct net_device *ndev)
0738 {
0739 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0740 struct phy_device *phydev = ndev->phydev;
0741 bool update = false;
0742
0743 if (phydev->link && (ax_local->speed != phydev->speed ||
0744 ax_local->duplex != phydev->duplex ||
0745 ax_local->pause != phydev->pause ||
0746 ax_local->asym_pause != phydev->asym_pause)) {
0747 ax_local->speed = phydev->speed;
0748 ax_local->duplex = phydev->duplex;
0749 ax_local->pause = phydev->pause;
0750 ax_local->asym_pause = phydev->asym_pause;
0751 update = true;
0752 }
0753
0754 if (phydev->link != ax_local->link) {
0755 if (!phydev->link) {
0756 ax_local->speed = SPEED_UNKNOWN;
0757 ax_local->duplex = DUPLEX_UNKNOWN;
0758 }
0759
0760 ax_local->link = phydev->link;
0761 update = true;
0762 }
0763
0764 if (update)
0765 ax88796c_set_mac(ax_local);
0766
0767 if (net_ratelimit())
0768 phy_print_status(ndev->phydev);
0769 }
0770
0771 static void ax88796c_set_csums(struct ax88796c_device *ax_local)
0772 {
0773 struct net_device *ndev = ax_local->ndev;
0774
0775 lockdep_assert_held(&ax_local->spi_lock);
0776
0777 if (ndev->features & NETIF_F_RXCSUM) {
0778 AX_WRITE(&ax_local->ax_spi, COERCR0_DEFAULT, P4_COERCR0);
0779 AX_WRITE(&ax_local->ax_spi, COERCR1_DEFAULT, P4_COERCR1);
0780 } else {
0781 AX_WRITE(&ax_local->ax_spi, 0, P4_COERCR0);
0782 AX_WRITE(&ax_local->ax_spi, 0, P4_COERCR1);
0783 }
0784
0785 if (ndev->features & NETIF_F_HW_CSUM) {
0786 AX_WRITE(&ax_local->ax_spi, COETCR0_DEFAULT, P4_COETCR0);
0787 AX_WRITE(&ax_local->ax_spi, COETCR1_TXPPPE, P4_COETCR1);
0788 } else {
0789 AX_WRITE(&ax_local->ax_spi, 0, P4_COETCR0);
0790 AX_WRITE(&ax_local->ax_spi, 0, P4_COETCR1);
0791 }
0792 }
0793
0794 static int
0795 ax88796c_open(struct net_device *ndev)
0796 {
0797 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0798 unsigned long irq_flag = 0;
0799 int fc = AX_FC_NONE;
0800 int ret;
0801 u16 t;
0802
0803 ret = request_irq(ndev->irq, ax88796c_interrupt,
0804 irq_flag, ndev->name, ndev);
0805 if (ret) {
0806 netdev_err(ndev, "unable to get IRQ %d (errno=%d).\n",
0807 ndev->irq, ret);
0808 return ret;
0809 }
0810
0811 mutex_lock(&ax_local->spi_lock);
0812
0813 ret = ax88796c_soft_reset(ax_local);
0814 if (ret < 0) {
0815 free_irq(ndev->irq, ndev);
0816 mutex_unlock(&ax_local->spi_lock);
0817 return ret;
0818 }
0819 ax_local->seq_num = 0x1f;
0820
0821 ax88796c_set_mac_addr(ndev);
0822 ax88796c_set_csums(ax_local);
0823
0824
0825 t = AX_READ(&ax_local->ax_spi, P1_RXBSPCR);
0826 t &= ~RXBSPCR_STUF_ENABLE;
0827 AX_WRITE(&ax_local->ax_spi, t, P1_RXBSPCR);
0828
0829
0830 AX_WRITE(&ax_local->ax_spi, RPPER_RXEN, P1_RPPER);
0831
0832 t = AX_READ(&ax_local->ax_spi, P0_FER);
0833 t |= FER_RXEN | FER_TXEN | FER_BSWAP | FER_IRQ_PULL;
0834 AX_WRITE(&ax_local->ax_spi, t, P0_FER);
0835
0836
0837 AX_WRITE(&ax_local->ax_spi,
0838 (LCR_LED0_EN | LCR_LED0_DUPLEX | LCR_LED1_EN |
0839 LCR_LED1_100MODE), P2_LCR0);
0840 AX_WRITE(&ax_local->ax_spi,
0841 (AX_READ(&ax_local->ax_spi, P2_LCR1) & LCR_LED2_MASK) |
0842 LCR_LED2_EN | LCR_LED2_LINK, P2_LCR1);
0843
0844
0845 AX_WRITE(&ax_local->ax_spi, PCR_PHYID(AX88796C_PHY_ID), P2_PCR);
0846
0847
0848 AX_WRITE(&ax_local->ax_spi, IMR_DEFAULT, P0_IMR);
0849
0850 mutex_unlock(&ax_local->spi_lock);
0851
0852
0853 phy_support_asym_pause(ax_local->phydev);
0854
0855 if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
0856 ax_local->phydev->advertising) ||
0857 linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
0858 ax_local->phydev->advertising))
0859 fc |= AX_FC_ANEG;
0860
0861 fc |= linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
0862 ax_local->phydev->advertising) ? AX_FC_RX : 0;
0863 fc |= (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
0864 ax_local->phydev->advertising) !=
0865 linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
0866 ax_local->phydev->advertising)) ? AX_FC_TX : 0;
0867 ax_local->flowctrl = fc;
0868
0869 phy_start(ax_local->ndev->phydev);
0870
0871 netif_start_queue(ndev);
0872
0873 spi_message_init(&ax_local->ax_spi.rx_msg);
0874
0875 return 0;
0876 }
0877
0878 static int
0879 ax88796c_close(struct net_device *ndev)
0880 {
0881 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0882
0883 phy_stop(ndev->phydev);
0884
0885
0886
0887
0888
0889
0890 mutex_lock(&ax_local->spi_lock);
0891
0892 netif_stop_queue(ndev);
0893
0894
0895
0896
0897
0898 netif_dbg(ax_local, ifdown, ndev, "clearing bits\n");
0899 clear_bit(EVENT_SET_MULTI, &ax_local->flags);
0900 clear_bit(EVENT_INTR, &ax_local->flags);
0901 clear_bit(EVENT_TX, &ax_local->flags);
0902
0903
0904 AX_WRITE(&ax_local->ax_spi, IMR_MASKALL, P0_IMR);
0905 __skb_queue_purge(&ax_local->tx_wait_q);
0906 ax88796c_soft_reset(ax_local);
0907
0908 mutex_unlock(&ax_local->spi_lock);
0909
0910 cancel_work_sync(&ax_local->ax_work);
0911
0912 free_irq(ndev->irq, ndev);
0913
0914 return 0;
0915 }
0916
0917 static int
0918 ax88796c_set_features(struct net_device *ndev, netdev_features_t features)
0919 {
0920 struct ax88796c_device *ax_local = to_ax88796c_device(ndev);
0921 netdev_features_t changed = features ^ ndev->features;
0922
0923 if (!(changed & (NETIF_F_RXCSUM | NETIF_F_HW_CSUM)))
0924 return 0;
0925
0926 ndev->features = features;
0927
0928 if (changed & (NETIF_F_RXCSUM | NETIF_F_HW_CSUM))
0929 ax88796c_set_csums(ax_local);
0930
0931 return 0;
0932 }
0933
0934 static const struct net_device_ops ax88796c_netdev_ops = {
0935 .ndo_open = ax88796c_open,
0936 .ndo_stop = ax88796c_close,
0937 .ndo_start_xmit = ax88796c_start_xmit,
0938 .ndo_get_stats64 = ax88796c_get_stats64,
0939 .ndo_eth_ioctl = ax88796c_ioctl,
0940 .ndo_set_mac_address = eth_mac_addr,
0941 .ndo_set_features = ax88796c_set_features,
0942 };
0943
0944 static int ax88796c_hard_reset(struct ax88796c_device *ax_local)
0945 {
0946 struct device *dev = (struct device *)&ax_local->spi->dev;
0947 struct gpio_desc *reset_gpio;
0948
0949
0950 reset_gpio = gpiod_get(dev, "reset", 0);
0951 if (IS_ERR(reset_gpio)) {
0952 dev_err(dev, "Could not get 'reset' GPIO: %ld", PTR_ERR(reset_gpio));
0953 return PTR_ERR(reset_gpio);
0954 }
0955
0956
0957 gpiod_direction_output(reset_gpio, 1);
0958 msleep(100);
0959 gpiod_direction_output(reset_gpio, 0);
0960 gpiod_put(reset_gpio);
0961 msleep(20);
0962
0963 return 0;
0964 }
0965
0966 static int ax88796c_probe(struct spi_device *spi)
0967 {
0968 char phy_id[MII_BUS_ID_SIZE + 3];
0969 struct ax88796c_device *ax_local;
0970 struct net_device *ndev;
0971 u16 temp;
0972 int ret;
0973
0974 ndev = devm_alloc_etherdev(&spi->dev, sizeof(*ax_local));
0975 if (!ndev)
0976 return -ENOMEM;
0977
0978 SET_NETDEV_DEV(ndev, &spi->dev);
0979
0980 ax_local = to_ax88796c_device(ndev);
0981
0982 dev_set_drvdata(&spi->dev, ax_local);
0983 ax_local->spi = spi;
0984 ax_local->ax_spi.spi = spi;
0985
0986 ax_local->stats =
0987 devm_netdev_alloc_pcpu_stats(&spi->dev,
0988 struct ax88796c_pcpu_stats);
0989 if (!ax_local->stats)
0990 return -ENOMEM;
0991
0992 ax_local->ndev = ndev;
0993 ax_local->priv_flags |= comp ? AX_CAP_COMP : 0;
0994 ax_local->msg_enable = msg_enable;
0995 mutex_init(&ax_local->spi_lock);
0996
0997 ax_local->mdiobus = devm_mdiobus_alloc(&spi->dev);
0998 if (!ax_local->mdiobus)
0999 return -ENOMEM;
1000
1001 ax_local->mdiobus->priv = ax_local;
1002 ax_local->mdiobus->read = ax88796c_mdio_read;
1003 ax_local->mdiobus->write = ax88796c_mdio_write;
1004 ax_local->mdiobus->name = "ax88976c-mdiobus";
1005 ax_local->mdiobus->phy_mask = (u32)~BIT(AX88796C_PHY_ID);
1006 ax_local->mdiobus->parent = &spi->dev;
1007
1008 snprintf(ax_local->mdiobus->id, MII_BUS_ID_SIZE,
1009 "ax88796c-%s.%u", dev_name(&spi->dev), spi->chip_select);
1010
1011 ret = devm_mdiobus_register(&spi->dev, ax_local->mdiobus);
1012 if (ret < 0) {
1013 dev_err(&spi->dev, "Could not register MDIO bus\n");
1014 return ret;
1015 }
1016
1017 if (netif_msg_probe(ax_local)) {
1018 dev_info(&spi->dev, "AX88796C-SPI Configuration:\n");
1019 dev_info(&spi->dev, " Compression : %s\n",
1020 ax_local->priv_flags & AX_CAP_COMP ? "ON" : "OFF");
1021 }
1022
1023 ndev->irq = spi->irq;
1024 ndev->netdev_ops = &ax88796c_netdev_ops;
1025 ndev->ethtool_ops = &ax88796c_ethtool_ops;
1026 ndev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
1027 ndev->features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
1028 ndev->needed_headroom = TX_OVERHEAD;
1029 ndev->needed_tailroom = TX_EOP_SIZE;
1030
1031 mutex_lock(&ax_local->spi_lock);
1032
1033
1034 ax88796c_hard_reset(ax_local);
1035
1036
1037 ret = ax88796c_soft_reset(ax_local);
1038 if (ret < 0) {
1039 ret = -ENODEV;
1040 mutex_unlock(&ax_local->spi_lock);
1041 goto err;
1042 }
1043
1044 temp = AX_READ(&ax_local->ax_spi, P2_CRIR);
1045 if ((temp & 0xF) != 0x0) {
1046 dev_err(&spi->dev, "spi read failed: %d\n", temp);
1047 ret = -ENODEV;
1048 mutex_unlock(&ax_local->spi_lock);
1049 goto err;
1050 }
1051
1052
1053 ax88796c_reload_eeprom(ax_local);
1054
1055 ax88796c_load_mac_addr(ndev);
1056
1057 if (netif_msg_probe(ax_local))
1058 dev_info(&spi->dev,
1059 "irq %d, MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n",
1060 ndev->irq,
1061 ndev->dev_addr[0], ndev->dev_addr[1],
1062 ndev->dev_addr[2], ndev->dev_addr[3],
1063 ndev->dev_addr[4], ndev->dev_addr[5]);
1064
1065
1066 AX_WRITE(&ax_local->ax_spi, (AX_READ(&ax_local->ax_spi, P0_PSCR)
1067 & PSCR_PS_MASK) | PSCR_PS_D0, P0_PSCR);
1068
1069 mutex_unlock(&ax_local->spi_lock);
1070
1071 INIT_WORK(&ax_local->ax_work, ax88796c_work);
1072
1073 skb_queue_head_init(&ax_local->tx_wait_q);
1074
1075 snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT,
1076 ax_local->mdiobus->id, AX88796C_PHY_ID);
1077 ax_local->phydev = phy_connect(ax_local->ndev, phy_id,
1078 ax88796c_handle_link_change,
1079 PHY_INTERFACE_MODE_MII);
1080 if (IS_ERR(ax_local->phydev)) {
1081 ret = PTR_ERR(ax_local->phydev);
1082 goto err;
1083 }
1084 ax_local->phydev->irq = PHY_POLL;
1085
1086 ret = devm_register_netdev(&spi->dev, ndev);
1087 if (ret) {
1088 dev_err(&spi->dev, "failed to register a network device\n");
1089 goto err_phy_dis;
1090 }
1091
1092 netif_info(ax_local, probe, ndev, "%s %s registered\n",
1093 dev_driver_string(&spi->dev),
1094 dev_name(&spi->dev));
1095 phy_attached_info(ax_local->phydev);
1096
1097 return 0;
1098
1099 err_phy_dis:
1100 phy_disconnect(ax_local->phydev);
1101 err:
1102 return ret;
1103 }
1104
1105 static void ax88796c_remove(struct spi_device *spi)
1106 {
1107 struct ax88796c_device *ax_local = dev_get_drvdata(&spi->dev);
1108 struct net_device *ndev = ax_local->ndev;
1109
1110 phy_disconnect(ndev->phydev);
1111
1112 netif_info(ax_local, probe, ndev, "removing network device %s %s\n",
1113 dev_driver_string(&spi->dev),
1114 dev_name(&spi->dev));
1115 }
1116
1117 #ifdef CONFIG_OF
1118 static const struct of_device_id ax88796c_dt_ids[] = {
1119 { .compatible = "asix,ax88796c" },
1120 {},
1121 };
1122 MODULE_DEVICE_TABLE(of, ax88796c_dt_ids);
1123 #endif
1124
1125 static const struct spi_device_id asix_id[] = {
1126 { "ax88796c", 0 },
1127 { }
1128 };
1129 MODULE_DEVICE_TABLE(spi, asix_id);
1130
1131 static struct spi_driver ax88796c_spi_driver = {
1132 .driver = {
1133 .name = DRV_NAME,
1134 .of_match_table = of_match_ptr(ax88796c_dt_ids),
1135 },
1136 .probe = ax88796c_probe,
1137 .remove = ax88796c_remove,
1138 .id_table = asix_id,
1139 };
1140
1141 static __init int ax88796c_spi_init(void)
1142 {
1143 int ret;
1144
1145 bitmap_zero(ax88796c_no_regs_mask, AX88796C_REGDUMP_LEN);
1146 ret = bitmap_parse(no_regs_list, 35,
1147 ax88796c_no_regs_mask, AX88796C_REGDUMP_LEN);
1148 if (ret) {
1149 bitmap_fill(ax88796c_no_regs_mask, AX88796C_REGDUMP_LEN);
1150 pr_err("Invalid bitmap description, masking all registers\n");
1151 }
1152
1153 return spi_register_driver(&ax88796c_spi_driver);
1154 }
1155
1156 static __exit void ax88796c_spi_exit(void)
1157 {
1158 spi_unregister_driver(&ax88796c_spi_driver);
1159 }
1160
1161 module_init(ax88796c_spi_init);
1162 module_exit(ax88796c_spi_exit);
1163
1164 MODULE_AUTHOR("Ćukasz Stelmach <l.stelmach@samsung.com>");
1165 MODULE_DESCRIPTION("ASIX AX88796C SPI Ethernet driver");
1166 MODULE_LICENSE("GPL");