Lines Matching +full:disable +full:- +full:eop
1 // SPDX-License-Identifier: GPL-2.0-only
44 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_soft_reset()
46 AX_WRITE(&ax_local->ax_spi, PSR_RESET, P0_PSR); in ax88796c_soft_reset()
47 AX_WRITE(&ax_local->ax_spi, PSR_RESET_CLR, P0_PSR); in ax88796c_soft_reset()
52 &ax_local->ax_spi, P0_PSR); in ax88796c_soft_reset()
56 temp = AX_READ(&ax_local->ax_spi, P4_SPICR); in ax88796c_soft_reset()
57 if (ax_local->priv_flags & AX_CAP_COMP) { in ax88796c_soft_reset()
58 AX_WRITE(&ax_local->ax_spi, in ax88796c_soft_reset()
60 ax_local->ax_spi.comp = 1; in ax88796c_soft_reset()
62 AX_WRITE(&ax_local->ax_spi, in ax88796c_soft_reset()
64 ax_local->ax_spi.comp = 0; in ax88796c_soft_reset()
74 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_reload_eeprom()
76 AX_WRITE(&ax_local->ax_spi, EECR_RELOAD, P3_EECR); in ax88796c_reload_eeprom()
81 &ax_local->ax_spi, P0_PSR); in ax88796c_reload_eeprom()
83 dev_err(&ax_local->spi->dev, in ax88796c_reload_eeprom()
97 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_set_hw_multicast()
99 memset(ax_local->multi_filter, 0, AX_MCAST_FILTER_SIZE); in ax88796c_set_hw_multicast()
101 if (ndev->flags & IFF_PROMISC) { in ax88796c_set_hw_multicast()
104 } else if (ndev->flags & IFF_ALLMULTI || mc_count > AX_MAX_MCAST) { in ax88796c_set_hw_multicast()
115 crc_bits = ether_crc(ETH_ALEN, ha->addr); in ax88796c_set_hw_multicast()
116 ax_local->multi_filter[crc_bits >> 29] |= in ax88796c_set_hw_multicast()
121 AX_WRITE(&ax_local->ax_spi, in ax88796c_set_hw_multicast()
122 ((ax_local->multi_filter[i * 2 + 1] << 8) | in ax88796c_set_hw_multicast()
123 ax_local->multi_filter[i * 2]), P3_MFAR(i)); in ax88796c_set_hw_multicast()
127 AX_WRITE(&ax_local->ax_spi, rx_ctl, P2_RXCR); in ax88796c_set_hw_multicast()
134 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_set_mac_addr()
136 AX_WRITE(&ax_local->ax_spi, ((u16)(ndev->dev_addr[4] << 8) | in ax88796c_set_mac_addr()
137 (u16)ndev->dev_addr[5]), P3_MACASR0); in ax88796c_set_mac_addr()
138 AX_WRITE(&ax_local->ax_spi, ((u16)(ndev->dev_addr[2] << 8) | in ax88796c_set_mac_addr()
139 (u16)ndev->dev_addr[3]), P3_MACASR1); in ax88796c_set_mac_addr()
140 AX_WRITE(&ax_local->ax_spi, ((u16)(ndev->dev_addr[0] << 8) | in ax88796c_set_mac_addr()
141 (u16)ndev->dev_addr[1]), P3_MACASR2); in ax88796c_set_mac_addr()
150 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_load_mac_addr()
153 if (!platform_get_ethdev_address(&ax_local->spi->dev, ndev) && in ax88796c_load_mac_addr()
154 is_valid_ether_addr(ndev->dev_addr)) { in ax88796c_load_mac_addr()
156 dev_info(&ax_local->spi->dev, in ax88796c_load_mac_addr()
162 temp = AX_READ(&ax_local->ax_spi, P3_MACASR0); in ax88796c_load_mac_addr()
166 temp = AX_READ(&ax_local->ax_spi, P3_MACASR1); in ax88796c_load_mac_addr()
170 temp = AX_READ(&ax_local->ax_spi, P3_MACASR2); in ax88796c_load_mac_addr()
177 dev_info(&ax_local->spi->dev, in ax88796c_load_mac_addr()
184 dev_info(&ax_local->spi->dev, "Use random MAC address\n"); in ax88796c_load_mac_addr()
190 u16 pkt_len_bar = (~info->pkt_len & TX_HDR_SOP_PKTLENBAR); in ax88796c_proc_tx_hdr()
193 info->sop.flags_len = info->pkt_len | in ax88796c_proc_tx_hdr()
197 info->sop.seq_lenbar = ((info->seq_num << 11) & TX_HDR_SOP_SEQNUM) in ax88796c_proc_tx_hdr()
199 cpu_to_be16s(&info->sop.flags_len); in ax88796c_proc_tx_hdr()
200 cpu_to_be16s(&info->sop.seq_lenbar); in ax88796c_proc_tx_hdr()
203 info->seg.flags_seqnum_seglen = TX_HDR_SEG_FS | TX_HDR_SEG_LS in ax88796c_proc_tx_hdr()
204 | info->pkt_len; in ax88796c_proc_tx_hdr()
206 info->seg.eo_so_seglenbar = pkt_len_bar; in ax88796c_proc_tx_hdr()
208 cpu_to_be16s(&info->seg.flags_seqnum_seglen); in ax88796c_proc_tx_hdr()
209 cpu_to_be16s(&info->seg.eo_so_seglenbar); in ax88796c_proc_tx_hdr()
211 /* Prepare EOP header */ in ax88796c_proc_tx_hdr()
212 info->eop.seq_len = ((info->seq_num << 11) & in ax88796c_proc_tx_hdr()
213 TX_HDR_EOP_SEQNUM) | info->pkt_len; in ax88796c_proc_tx_hdr()
214 info->eop.seqbar_lenbar = ((~info->seq_num << 11) & in ax88796c_proc_tx_hdr()
217 cpu_to_be16s(&info->eop.seq_len); in ax88796c_proc_tx_hdr()
218 cpu_to_be16s(&info->eop.seqbar_lenbar); in ax88796c_proc_tx_hdr()
227 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_check_free_pages()
229 free_pages = AX_READ(&ax_local->ax_spi, P0_TFBFCR) & TX_FREEBUF_MASK; in ax88796c_check_free_pages()
232 tmp = AX_READ(&ax_local->ax_spi, P0_TFBFCR) in ax88796c_check_free_pages()
234 AX_WRITE(&ax_local->ax_spi, tmp | TFBFCR_TX_PAGE_SET | in ax88796c_check_free_pages()
237 return -ENOMEM; in ax88796c_check_free_pages()
247 u8 spi_len = ax_local->ax_spi.comp ? 1 : 4; in ax88796c_tx_fixup()
261 pkt_len = skb->len; in ax88796c_tx_fixup()
268 padlen = round_up(pkt_len, 4) - pkt_len; in ax88796c_tx_fixup()
269 seq_num = ++ax_local->seq_num & 0x1F; in ax88796c_tx_fixup()
276 size_t h = max((TX_OVERHEAD + spi_len) - headroom, 0); in ax88796c_tx_fixup()
277 size_t t = max((padlen + TX_EOP_SIZE) - tailroom, 0); in ax88796c_tx_fixup()
284 ax88796c_proc_tx_hdr(&info, skb->ip_summed); in ax88796c_tx_fixup()
292 /* Make 32-bit alignment */ in ax88796c_tx_fixup()
295 /* EOP header */ in ax88796c_tx_fixup()
296 skb_put_data(skb, &info.eop, TX_EOP_SIZE); in ax88796c_tx_fixup()
300 entry = (struct skb_data *)skb->cb; in ax88796c_tx_fixup()
302 entry->len = pkt_len; in ax88796c_tx_fixup()
307 snprintf(pfx, sizeof(pfx), "%s: ", ndev->name); in ax88796c_tx_fixup()
310 pkt_len, skb->len, seq_num); in ax88796c_tx_fixup()
314 skb->data, 4, 0); in ax88796c_tx_fixup()
318 skb->data + 4, TX_OVERHEAD, 0); in ax88796c_tx_fixup()
322 skb->data + 4 + TX_OVERHEAD, in ax88796c_tx_fixup()
323 skb->len - TX_EOP_SIZE - 4 - TX_OVERHEAD, 0); in ax88796c_tx_fixup()
325 netdev_info(ndev, " TX EOP:\n"); in ax88796c_tx_fixup()
327 skb->data + skb->len - 4, 4, 0); in ax88796c_tx_fixup()
340 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_hard_xmit()
342 stats = this_cpu_ptr(ax_local->stats); in ax88796c_hard_xmit()
343 tx_skb = ax88796c_tx_fixup(ax_local->ndev, &ax_local->tx_wait_q); in ax88796c_hard_xmit()
346 this_cpu_inc(ax_local->stats->tx_dropped); in ax88796c_hard_xmit()
349 entry = (struct skb_data *)tx_skb->cb; in ax88796c_hard_xmit()
351 AX_WRITE(&ax_local->ax_spi, in ax88796c_hard_xmit()
354 axspi_write_txq(&ax_local->ax_spi, tx_skb->data, tx_skb->len); in ax88796c_hard_xmit()
356 if (((AX_READ(&ax_local->ax_spi, P0_TSNR) & TXNR_TXB_IDLE) == 0) || in ax88796c_hard_xmit()
357 ((ISR_TXERR & AX_READ(&ax_local->ax_spi, P0_ISR)) != 0)) { in ax88796c_hard_xmit()
359 AX_WRITE(&ax_local->ax_spi, ISR_TXERR, P0_ISR); in ax88796c_hard_xmit()
361 this_cpu_inc(ax_local->stats->tx_dropped); in ax88796c_hard_xmit()
364 netif_err(ax_local, tx_err, ax_local->ndev, in ax88796c_hard_xmit()
365 "TX FIFO error, re-initialize the TX bridge\n"); in ax88796c_hard_xmit()
368 AX_WRITE(&ax_local->ax_spi, TXNR_TXB_REINIT | in ax88796c_hard_xmit()
369 AX_READ(&ax_local->ax_spi, P0_TSNR), P0_TSNR); in ax88796c_hard_xmit()
370 ax_local->seq_num = 0; in ax88796c_hard_xmit()
372 flags = u64_stats_update_begin_irqsave(&stats->syncp); in ax88796c_hard_xmit()
373 u64_stats_inc(&stats->tx_packets); in ax88796c_hard_xmit()
374 u64_stats_add(&stats->tx_bytes, entry->len); in ax88796c_hard_xmit()
375 u64_stats_update_end_irqrestore(&stats->syncp, flags); in ax88796c_hard_xmit()
378 entry->state = tx_done; in ax88796c_hard_xmit()
389 skb_queue_tail(&ax_local->tx_wait_q, skb); in ax88796c_start_xmit()
390 if (skb_queue_len(&ax_local->tx_wait_q) > TX_QUEUE_HIGH_WATER) in ax88796c_start_xmit()
393 set_bit(EVENT_TX, &ax_local->flags); in ax88796c_start_xmit()
394 schedule_work(&ax_local->ax_work); in ax88796c_start_xmit()
403 struct net_device *ndev = ax_local->ndev; in ax88796c_skb_return()
408 stats = this_cpu_ptr(ax_local->stats); in ax88796c_skb_return()
411 if (!(ndev->features & NETIF_F_RXCSUM)) in ax88796c_skb_return()
415 if ((rxhdr->flags & RX_HDR3_L3_ERR) || in ax88796c_skb_return()
416 (rxhdr->flags & RX_HDR3_L4_ERR)) in ax88796c_skb_return()
420 if ((rxhdr->flags & RX_HDR3_L4_TYPE_TCP) || in ax88796c_skb_return()
421 (rxhdr->flags & RX_HDR3_L4_TYPE_UDP)) in ax88796c_skb_return()
422 skb->ip_summed = CHECKSUM_UNNECESSARY; in ax88796c_skb_return()
425 flags = u64_stats_update_begin_irqsave(&stats->syncp); in ax88796c_skb_return()
426 u64_stats_inc(&stats->rx_packets); in ax88796c_skb_return()
427 u64_stats_add(&stats->rx_bytes, skb->len); in ax88796c_skb_return()
428 u64_stats_update_end_irqrestore(&stats->syncp, flags); in ax88796c_skb_return()
430 skb->dev = ndev; in ax88796c_skb_return()
431 skb->protocol = eth_type_trans(skb, ax_local->ndev); in ax88796c_skb_return()
434 skb->len + sizeof(struct ethhdr), skb->protocol); in ax88796c_skb_return()
445 struct rx_header *rxhdr = (struct rx_header *)rx_skb->data; in ax88796c_rx_fixup()
446 struct net_device *ndev = ax_local->ndev; in ax88796c_rx_fixup()
449 be16_to_cpus(&rxhdr->flags_len); in ax88796c_rx_fixup()
450 be16_to_cpus(&rxhdr->seq_lenbar); in ax88796c_rx_fixup()
451 be16_to_cpus(&rxhdr->flags); in ax88796c_rx_fixup()
453 if ((rxhdr->flags_len & RX_HDR1_PKT_LEN) != in ax88796c_rx_fixup()
454 (~rxhdr->seq_lenbar & 0x7FF)) { in ax88796c_rx_fixup()
457 this_cpu_inc(ax_local->stats->rx_frame_errors); in ax88796c_rx_fixup()
462 if ((rxhdr->flags_len & RX_HDR1_MII_ERR) || in ax88796c_rx_fixup()
463 (rxhdr->flags_len & RX_HDR1_CRC_ERR)) { in ax88796c_rx_fixup()
466 this_cpu_inc(ax_local->stats->rx_crc_errors); in ax88796c_rx_fixup()
471 len = rxhdr->flags_len & RX_HDR1_PKT_LEN; in ax88796c_rx_fixup()
475 snprintf(pfx, sizeof(pfx), "%s: ", ndev->name); in ax88796c_rx_fixup()
477 rx_skb->len, len); in ax88796c_rx_fixup()
481 rx_skb->data, sizeof(*rxhdr), 0); in ax88796c_rx_fixup()
485 rx_skb->data + sizeof(*rxhdr), len, 0); in ax88796c_rx_fixup()
502 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_receive()
505 AX_WRITE(&ax_local->ax_spi, AX_READ(&ax_local->ax_spi, P0_RTWCR) in ax88796c_receive()
508 pkt_cnt = AX_READ(&ax_local->ax_spi, P0_RXBCR2) & RXBCR2_PKT_MASK; in ax88796c_receive()
512 pkt_len = AX_READ(&ax_local->ax_spi, P0_RCPHR) & 0x7FF; in ax88796c_receive()
518 AX_WRITE(&ax_local->ax_spi, RXBCR1_RXB_DISCARD, P0_RXBCR1); in ax88796c_receive()
519 this_cpu_inc(ax_local->stats->rx_dropped); in ax88796c_receive()
522 entry = (struct skb_data *)skb->cb; in ax88796c_receive()
524 AX_WRITE(&ax_local->ax_spi, RXBCR1_RXB_START | w_count, P0_RXBCR1); in ax88796c_receive()
526 axspi_read_rxq(&ax_local->ax_spi, in ax88796c_receive()
527 skb_put(skb, w_count * 2), skb->len); in ax88796c_receive()
530 if ((AX_READ(&ax_local->ax_spi, P0_RXBCR2) & RXBCR2_RXB_IDLE) == 0) { in ax88796c_receive()
534 AX_WRITE(&ax_local->ax_spi, RXBCR2_RXB_REINIT, P0_RXBCR2); in ax88796c_receive()
536 entry->state = rx_err; in ax88796c_receive()
538 entry->state = rx_done; in ax88796c_receive()
541 AX_WRITE(&ax_local->ax_spi, ISR_RXPKT, P0_ISR); in ax88796c_receive()
550 struct net_device *ndev = ax_local->ndev; in ax88796c_process_isr()
554 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_process_isr()
556 isr = AX_READ(&ax_local->ax_spi, P0_ISR); in ax88796c_process_isr()
557 AX_WRITE(&ax_local->ax_spi, isr, P0_ISR); in ax88796c_process_isr()
563 AX_WRITE(&ax_local->ax_spi, TXNR_TXB_REINIT, P0_TSNR); in ax88796c_process_isr()
564 ax_local->seq_num = 0x1f; in ax88796c_process_isr()
569 set_bit(EVENT_TX, &ax_local->flags); in ax88796c_process_isr()
574 phy_mac_interrupt(ax_local->ndev->phydev); in ax88796c_process_isr()
579 todo = ax88796c_receive(ax_local->ndev); in ax88796c_process_isr()
601 set_bit(EVENT_INTR, &ax_local->flags); in ax88796c_interrupt()
602 schedule_work(&ax_local->ax_work); in ax88796c_interrupt()
612 mutex_lock(&ax_local->spi_lock); in ax88796c_work()
614 if (test_bit(EVENT_SET_MULTI, &ax_local->flags)) { in ax88796c_work()
615 ax88796c_set_hw_multicast(ax_local->ndev); in ax88796c_work()
616 clear_bit(EVENT_SET_MULTI, &ax_local->flags); in ax88796c_work()
619 if (test_bit(EVENT_INTR, &ax_local->flags)) { in ax88796c_work()
620 AX_WRITE(&ax_local->ax_spi, IMR_MASKALL, P0_IMR); in ax88796c_work()
625 clear_bit(EVENT_INTR, &ax_local->flags); in ax88796c_work()
627 AX_WRITE(&ax_local->ax_spi, IMR_DEFAULT, P0_IMR); in ax88796c_work()
629 enable_irq(ax_local->ndev->irq); in ax88796c_work()
632 if (test_bit(EVENT_TX, &ax_local->flags)) { in ax88796c_work()
633 while (skb_queue_len(&ax_local->tx_wait_q)) { in ax88796c_work()
638 clear_bit(EVENT_TX, &ax_local->flags); in ax88796c_work()
640 if (netif_queue_stopped(ax_local->ndev) && in ax88796c_work()
641 (skb_queue_len(&ax_local->tx_wait_q) < TX_QUEUE_LOW_WATER)) in ax88796c_work()
642 netif_wake_queue(ax_local->ndev); in ax88796c_work()
645 mutex_unlock(&ax_local->spi_lock); in ax88796c_work()
662 s = per_cpu_ptr(ax_local->stats, cpu); in ax88796c_get_stats64()
665 start = u64_stats_fetch_begin(&s->syncp); in ax88796c_get_stats64()
666 rx_packets = u64_stats_read(&s->rx_packets); in ax88796c_get_stats64()
667 rx_bytes = u64_stats_read(&s->rx_bytes); in ax88796c_get_stats64()
668 tx_packets = u64_stats_read(&s->tx_packets); in ax88796c_get_stats64()
669 tx_bytes = u64_stats_read(&s->tx_bytes); in ax88796c_get_stats64()
670 } while (u64_stats_fetch_retry(&s->syncp, start)); in ax88796c_get_stats64()
672 stats->rx_packets += rx_packets; in ax88796c_get_stats64()
673 stats->rx_bytes += rx_bytes; in ax88796c_get_stats64()
674 stats->tx_packets += tx_packets; in ax88796c_get_stats64()
675 stats->tx_bytes += tx_bytes; in ax88796c_get_stats64()
677 rx_dropped += s->rx_dropped; in ax88796c_get_stats64()
678 tx_dropped += s->tx_dropped; in ax88796c_get_stats64()
679 rx_frame_errors += s->rx_frame_errors; in ax88796c_get_stats64()
680 rx_crc_errors += s->rx_crc_errors; in ax88796c_get_stats64()
683 stats->rx_dropped = rx_dropped; in ax88796c_get_stats64()
684 stats->tx_dropped = tx_dropped; in ax88796c_get_stats64()
685 stats->rx_frame_errors = rx_frame_errors; in ax88796c_get_stats64()
686 stats->rx_crc_errors = rx_crc_errors; in ax88796c_get_stats64()
693 maccr = (ax_local->link) ? MACCR_RXEN : 0; in ax88796c_set_mac()
695 switch (ax_local->speed) { in ax88796c_set_mac()
706 switch (ax_local->duplex) { in ax88796c_set_mac()
717 if (ax_local->flowctrl & AX_FC_ANEG && in ax88796c_set_mac()
718 ax_local->phydev->autoneg) { in ax88796c_set_mac()
719 maccr |= ax_local->pause ? MACCR_RXFC_ENABLE : 0; in ax88796c_set_mac()
720 maccr |= !ax_local->pause != !ax_local->asym_pause ? in ax88796c_set_mac()
723 maccr |= (ax_local->flowctrl & AX_FC_RX) ? MACCR_RXFC_ENABLE : 0; in ax88796c_set_mac()
724 maccr |= (ax_local->flowctrl & AX_FC_TX) ? MACCR_TXFC_ENABLE : 0; in ax88796c_set_mac()
727 mutex_lock(&ax_local->spi_lock); in ax88796c_set_mac()
729 maccr |= AX_READ(&ax_local->ax_spi, P0_MACCR) & in ax88796c_set_mac()
732 AX_WRITE(&ax_local->ax_spi, maccr, P0_MACCR); in ax88796c_set_mac()
734 mutex_unlock(&ax_local->spi_lock); in ax88796c_set_mac()
740 struct phy_device *phydev = ndev->phydev; in ax88796c_handle_link_change()
743 if (phydev->link && (ax_local->speed != phydev->speed || in ax88796c_handle_link_change()
744 ax_local->duplex != phydev->duplex || in ax88796c_handle_link_change()
745 ax_local->pause != phydev->pause || in ax88796c_handle_link_change()
746 ax_local->asym_pause != phydev->asym_pause)) { in ax88796c_handle_link_change()
747 ax_local->speed = phydev->speed; in ax88796c_handle_link_change()
748 ax_local->duplex = phydev->duplex; in ax88796c_handle_link_change()
749 ax_local->pause = phydev->pause; in ax88796c_handle_link_change()
750 ax_local->asym_pause = phydev->asym_pause; in ax88796c_handle_link_change()
754 if (phydev->link != ax_local->link) { in ax88796c_handle_link_change()
755 if (!phydev->link) { in ax88796c_handle_link_change()
756 ax_local->speed = SPEED_UNKNOWN; in ax88796c_handle_link_change()
757 ax_local->duplex = DUPLEX_UNKNOWN; in ax88796c_handle_link_change()
760 ax_local->link = phydev->link; in ax88796c_handle_link_change()
768 phy_print_status(ndev->phydev); in ax88796c_handle_link_change()
773 struct net_device *ndev = ax_local->ndev; in ax88796c_set_csums()
775 lockdep_assert_held(&ax_local->spi_lock); in ax88796c_set_csums()
777 if (ndev->features & NETIF_F_RXCSUM) { in ax88796c_set_csums()
778 AX_WRITE(&ax_local->ax_spi, COERCR0_DEFAULT, P4_COERCR0); in ax88796c_set_csums()
779 AX_WRITE(&ax_local->ax_spi, COERCR1_DEFAULT, P4_COERCR1); in ax88796c_set_csums()
781 AX_WRITE(&ax_local->ax_spi, 0, P4_COERCR0); in ax88796c_set_csums()
782 AX_WRITE(&ax_local->ax_spi, 0, P4_COERCR1); in ax88796c_set_csums()
785 if (ndev->features & NETIF_F_HW_CSUM) { in ax88796c_set_csums()
786 AX_WRITE(&ax_local->ax_spi, COETCR0_DEFAULT, P4_COETCR0); in ax88796c_set_csums()
787 AX_WRITE(&ax_local->ax_spi, COETCR1_TXPPPE, P4_COETCR1); in ax88796c_set_csums()
789 AX_WRITE(&ax_local->ax_spi, 0, P4_COETCR0); in ax88796c_set_csums()
790 AX_WRITE(&ax_local->ax_spi, 0, P4_COETCR1); in ax88796c_set_csums()
803 ret = request_irq(ndev->irq, ax88796c_interrupt, in ax88796c_open()
804 irq_flag, ndev->name, ndev); in ax88796c_open()
807 ndev->irq, ret); in ax88796c_open()
811 mutex_lock(&ax_local->spi_lock); in ax88796c_open()
815 free_irq(ndev->irq, ndev); in ax88796c_open()
816 mutex_unlock(&ax_local->spi_lock); in ax88796c_open()
819 ax_local->seq_num = 0x1f; in ax88796c_open()
824 /* Disable stuffing packet */ in ax88796c_open()
825 t = AX_READ(&ax_local->ax_spi, P1_RXBSPCR); in ax88796c_open()
827 AX_WRITE(&ax_local->ax_spi, t, P1_RXBSPCR); in ax88796c_open()
830 AX_WRITE(&ax_local->ax_spi, RPPER_RXEN, P1_RPPER); in ax88796c_open()
832 t = AX_READ(&ax_local->ax_spi, P0_FER); in ax88796c_open()
834 AX_WRITE(&ax_local->ax_spi, t, P0_FER); in ax88796c_open()
837 AX_WRITE(&ax_local->ax_spi, in ax88796c_open()
840 AX_WRITE(&ax_local->ax_spi, in ax88796c_open()
841 (AX_READ(&ax_local->ax_spi, P2_LCR1) & LCR_LED2_MASK) | in ax88796c_open()
844 /* Disable PHY auto-polling */ in ax88796c_open()
845 AX_WRITE(&ax_local->ax_spi, PCR_PHYID(AX88796C_PHY_ID), P2_PCR); in ax88796c_open()
848 AX_WRITE(&ax_local->ax_spi, IMR_DEFAULT, P0_IMR); in ax88796c_open()
850 mutex_unlock(&ax_local->spi_lock); in ax88796c_open()
852 /* Setup flow-control configuration */ in ax88796c_open()
853 phy_support_asym_pause(ax_local->phydev); in ax88796c_open()
856 ax_local->phydev->advertising) || in ax88796c_open()
858 ax_local->phydev->advertising)) in ax88796c_open()
862 ax_local->phydev->advertising) ? AX_FC_RX : 0; in ax88796c_open()
864 ax_local->phydev->advertising) != in ax88796c_open()
866 ax_local->phydev->advertising)) ? AX_FC_TX : 0; in ax88796c_open()
867 ax_local->flowctrl = fc; in ax88796c_open()
869 phy_start(ax_local->ndev->phydev); in ax88796c_open()
873 spi_message_init(&ax_local->ax_spi.rx_msg); in ax88796c_open()
883 phy_stop(ndev->phydev); in ax88796c_close()
890 mutex_lock(&ax_local->spi_lock); in ax88796c_close()
899 clear_bit(EVENT_SET_MULTI, &ax_local->flags); in ax88796c_close()
900 clear_bit(EVENT_INTR, &ax_local->flags); in ax88796c_close()
901 clear_bit(EVENT_TX, &ax_local->flags); in ax88796c_close()
903 /* Disable MAC interrupts */ in ax88796c_close()
904 AX_WRITE(&ax_local->ax_spi, IMR_MASKALL, P0_IMR); in ax88796c_close()
905 __skb_queue_purge(&ax_local->tx_wait_q); in ax88796c_close()
908 mutex_unlock(&ax_local->spi_lock); in ax88796c_close()
910 cancel_work_sync(&ax_local->ax_work); in ax88796c_close()
912 free_irq(ndev->irq, ndev); in ax88796c_close()
921 netdev_features_t changed = features ^ ndev->features; in ax88796c_set_features()
926 ndev->features = features; in ax88796c_set_features()
946 struct device *dev = (struct device *)&ax_local->spi->dev; in ax88796c_hard_reset()
974 ndev = devm_alloc_etherdev(&spi->dev, sizeof(*ax_local)); in ax88796c_probe()
976 return -ENOMEM; in ax88796c_probe()
978 SET_NETDEV_DEV(ndev, &spi->dev); in ax88796c_probe()
982 dev_set_drvdata(&spi->dev, ax_local); in ax88796c_probe()
983 ax_local->spi = spi; in ax88796c_probe()
984 ax_local->ax_spi.spi = spi; in ax88796c_probe()
986 ax_local->stats = in ax88796c_probe()
987 devm_netdev_alloc_pcpu_stats(&spi->dev, in ax88796c_probe()
989 if (!ax_local->stats) in ax88796c_probe()
990 return -ENOMEM; in ax88796c_probe()
992 ax_local->ndev = ndev; in ax88796c_probe()
993 ax_local->priv_flags |= comp ? AX_CAP_COMP : 0; in ax88796c_probe()
994 ax_local->msg_enable = msg_enable; in ax88796c_probe()
995 mutex_init(&ax_local->spi_lock); in ax88796c_probe()
997 ax_local->mdiobus = devm_mdiobus_alloc(&spi->dev); in ax88796c_probe()
998 if (!ax_local->mdiobus) in ax88796c_probe()
999 return -ENOMEM; in ax88796c_probe()
1001 ax_local->mdiobus->priv = ax_local; in ax88796c_probe()
1002 ax_local->mdiobus->read = ax88796c_mdio_read; in ax88796c_probe()
1003 ax_local->mdiobus->write = ax88796c_mdio_write; in ax88796c_probe()
1004 ax_local->mdiobus->name = "ax88976c-mdiobus"; in ax88796c_probe()
1005 ax_local->mdiobus->phy_mask = (u32)~BIT(AX88796C_PHY_ID); in ax88796c_probe()
1006 ax_local->mdiobus->parent = &spi->dev; in ax88796c_probe()
1008 snprintf(ax_local->mdiobus->id, MII_BUS_ID_SIZE, in ax88796c_probe()
1009 "ax88796c-%s.%u", dev_name(&spi->dev), spi_get_chipselect(spi, 0)); in ax88796c_probe()
1011 ret = devm_mdiobus_register(&spi->dev, ax_local->mdiobus); in ax88796c_probe()
1013 dev_err(&spi->dev, "Could not register MDIO bus\n"); in ax88796c_probe()
1018 dev_info(&spi->dev, "AX88796C-SPI Configuration:\n"); in ax88796c_probe()
1019 dev_info(&spi->dev, " Compression : %s\n", in ax88796c_probe()
1020 ax_local->priv_flags & AX_CAP_COMP ? "ON" : "OFF"); in ax88796c_probe()
1023 ndev->irq = spi->irq; in ax88796c_probe()
1024 ndev->netdev_ops = &ax88796c_netdev_ops; in ax88796c_probe()
1025 ndev->ethtool_ops = &ax88796c_ethtool_ops; in ax88796c_probe()
1026 ndev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM; in ax88796c_probe()
1027 ndev->features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM; in ax88796c_probe()
1028 ndev->needed_headroom = TX_OVERHEAD; in ax88796c_probe()
1029 ndev->needed_tailroom = TX_EOP_SIZE; in ax88796c_probe()
1031 mutex_lock(&ax_local->spi_lock); in ax88796c_probe()
1039 ret = -ENODEV; in ax88796c_probe()
1040 mutex_unlock(&ax_local->spi_lock); in ax88796c_probe()
1044 temp = AX_READ(&ax_local->ax_spi, P2_CRIR); in ax88796c_probe()
1046 dev_err(&spi->dev, "spi read failed: %d\n", temp); in ax88796c_probe()
1047 ret = -ENODEV; in ax88796c_probe()
1048 mutex_unlock(&ax_local->spi_lock); in ax88796c_probe()
1058 dev_info(&spi->dev, in ax88796c_probe()
1060 ndev->irq, in ax88796c_probe()
1061 ndev->dev_addr[0], ndev->dev_addr[1], in ax88796c_probe()
1062 ndev->dev_addr[2], ndev->dev_addr[3], in ax88796c_probe()
1063 ndev->dev_addr[4], ndev->dev_addr[5]); in ax88796c_probe()
1065 /* Disable power saving */ in ax88796c_probe()
1066 AX_WRITE(&ax_local->ax_spi, (AX_READ(&ax_local->ax_spi, P0_PSCR) in ax88796c_probe()
1069 mutex_unlock(&ax_local->spi_lock); in ax88796c_probe()
1071 INIT_WORK(&ax_local->ax_work, ax88796c_work); in ax88796c_probe()
1073 skb_queue_head_init(&ax_local->tx_wait_q); in ax88796c_probe()
1076 ax_local->mdiobus->id, AX88796C_PHY_ID); in ax88796c_probe()
1077 ax_local->phydev = phy_connect(ax_local->ndev, phy_id, in ax88796c_probe()
1080 if (IS_ERR(ax_local->phydev)) { in ax88796c_probe()
1081 ret = PTR_ERR(ax_local->phydev); in ax88796c_probe()
1084 ax_local->phydev->irq = PHY_POLL; in ax88796c_probe()
1086 ret = devm_register_netdev(&spi->dev, ndev); in ax88796c_probe()
1088 dev_err(&spi->dev, "failed to register a network device\n"); in ax88796c_probe()
1093 dev_driver_string(&spi->dev), in ax88796c_probe()
1094 dev_name(&spi->dev)); in ax88796c_probe()
1095 phy_attached_info(ax_local->phydev); in ax88796c_probe()
1100 phy_disconnect(ax_local->phydev); in ax88796c_probe()
1107 struct ax88796c_device *ax_local = dev_get_drvdata(&spi->dev); in ax88796c_remove()
1108 struct net_device *ndev = ax_local->ndev; in ax88796c_remove()
1110 phy_disconnect(ndev->phydev); in ax88796c_remove()
1113 dev_driver_string(&spi->dev), in ax88796c_remove()
1114 dev_name(&spi->dev)); in ax88796c_remove()