Lines Matching +full:self +full:- +full:advertising
1 // SPDX-License-Identifier: GPL-2.0
10 * 2000/11/11 Willy Tarreau <willy AT meta-x.org>
11 * - port to non-sparc architectures. Tested only on x86 and
13 * - ability to specify the MAC address at module load time by passing this
38 #include <linux/dma-mapping.h>
117 tlp->tstamp = (unsigned int)jiffies; in tx_add_log()
118 tlp->tx_new = hp->tx_new; in tx_add_log()
119 tlp->tx_old = hp->tx_old; in tx_add_log()
120 tlp->action = a; in tx_add_log()
121 tlp->status = s; in tx_add_log()
122 txlog_cur_entry = (txlog_cur_entry + 1) & (TX_LOG_LEN - 1); in tx_add_log()
135 this = (this + 1) & (TX_LOG_LEN - 1); in tx_dump_log()
140 struct hmeal_init_block *hb = hp->happy_block; in tx_dump_ring()
141 struct happy_meal_txd *tp = &hb->happy_meal_txd[0]; in tx_dump_ring()
173 #define DEFAULT_IPG0 16 /* For lance-mode only */
182 * the two stores so that I can sleep well at night... -DaveM
198 rxd->rx_addr = (__force hme32)addr; in sbus_hme_write_rxd()
200 rxd->rx_flags = (__force hme32)flags; in sbus_hme_write_rxd()
205 txd->tx_addr = (__force hme32)addr; in sbus_hme_write_txd()
207 txd->tx_flags = (__force hme32)flags; in sbus_hme_write_txd()
227 rxd->rx_addr = (__force hme32)cpu_to_le32(addr); in pci_hme_write_rxd()
229 rxd->rx_flags = (__force hme32)cpu_to_le32(flags); in pci_hme_write_rxd()
234 txd->tx_addr = (__force hme32)cpu_to_le32(addr); in pci_hme_write_txd()
236 txd->tx_flags = (__force hme32)cpu_to_le32(flags); in pci_hme_write_txd()
245 ((__hp)->write32((__reg), (__val)))
247 ((__hp)->read32(__reg))
249 ((__hp)->write_rxd((__rxd), (__flags), (__addr)))
251 ((__hp)->write_txd((__txd), (__flags), (__addr)))
253 ((__hp)->read_desc32(__p))
262 do { (__rxd)->rx_addr = (__force hme32)(u32)(__addr); \
264 (__rxd)->rx_flags = (__force hme32)(u32)(__flags); \
267 do { (__txd)->tx_addr = (__force hme32)(u32)(__addr); \
269 (__txd)->tx_flags = (__force hme32)(u32)(__flags); \
279 do { (__rxd)->rx_addr = (__force hme32)cpu_to_le32(__addr); \
281 (__rxd)->rx_flags = (__force hme32)cpu_to_le32(__flags); \
284 do { (__txd)->tx_addr = (__force hme32)cpu_to_le32(__addr); \
286 (__txd)->tx_flags = (__force hme32)cpu_to_le32(__flags); \
362 tmp = hp->paddr & 0xff; in happy_meal_bb_read()
363 for (i = 4; i >= 0; i--) in happy_meal_bb_read()
368 for (i = 4; i >= 0; i--) in happy_meal_bb_read()
375 (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal)); in happy_meal_bb_read()
376 for (i = 15; i >= 0; i--) in happy_meal_bb_read()
377 retval |= BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal)); in happy_meal_bb_read()
378 (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal)); in happy_meal_bb_read()
379 (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal)); in happy_meal_bb_read()
380 (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal)); in happy_meal_bb_read()
408 tmp = (hp->paddr & 0xff); in happy_meal_bb_write()
409 for (i = 4; i >= 0; i--) in happy_meal_bb_write()
414 for (i = 4; i >= 0; i--) in happy_meal_bb_write()
421 for (i = 15; i >= 0; i--) in happy_meal_bb_write()
437 if (hp->tcvr_type == none) { in happy_meal_tcvr_read()
442 if (!(hp->happy_flags & HFLAG_FENABLE)) { in happy_meal_tcvr_read()
448 (FRAME_READ | (hp->paddr << 23) | ((reg & 0xff) << 18))); in happy_meal_tcvr_read()
449 while (!(hme_read32(hp, tregs + TCVR_FRAME) & 0x10000) && --tries) in happy_meal_tcvr_read()
471 if (!(hp->happy_flags & HFLAG_FENABLE)) { in happy_meal_tcvr_write()
478 (FRAME_WRITE | (hp->paddr << 23) | in happy_meal_tcvr_write()
480 while (!(hme_read32(hp, tregs + TCVR_FRAME) & 0x10000) && --tries) in happy_meal_tcvr_write()
487 /* Fifty-two cents is your change, have a nice day. */ in happy_meal_tcvr_write()
501 * configurations and we stop when we see a link-up condition before the
508 * 100 Base-T Full Duplex
509 * 100 Base-T Half Duplex
510 * 10 Base-T Full Duplex
511 * 10 Base-T Half Duplex
514 * been detected. This timer just waits for the link-up bit to get set in
524 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR); in try_next_permutation()
529 if (hp->sw_bmcr & BMCR_FULLDPLX) { in try_next_permutation()
530 hp->sw_bmcr &= ~(BMCR_FULLDPLX); in try_next_permutation()
531 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in try_next_permutation()
536 if (hp->sw_bmcr & BMCR_SPEED100) { in try_next_permutation()
537 hp->sw_bmcr &= ~(BMCR_SPEED100); in try_next_permutation()
538 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in try_next_permutation()
543 return -1; in try_next_permutation()
548 printk(KERN_INFO "%s: Link is up using ", hp->dev->name); in display_link_mode()
549 if (hp->tcvr_type == external) in display_link_mode()
554 hp->sw_lpa = happy_meal_tcvr_read(hp, tregs, MII_LPA); in display_link_mode()
555 if (hp->sw_lpa & (LPA_100HALF | LPA_100FULL)) { in display_link_mode()
556 if (hp->sw_lpa & LPA_100FULL) in display_link_mode()
561 if (hp->sw_lpa & LPA_10FULL) in display_link_mode()
570 printk(KERN_INFO "%s: Link has been forced up using ", hp->dev->name); in display_forced_link_mode()
571 if (hp->tcvr_type == external) in display_forced_link_mode()
576 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR); in display_forced_link_mode()
577 if (hp->sw_bmcr & BMCR_SPEED100) in display_forced_link_mode()
581 if (hp->sw_bmcr & BMCR_FULLDPLX) in display_forced_link_mode()
594 if (hp->timer_state == arbwait) { in set_happy_link_modes()
595 hp->sw_lpa = happy_meal_tcvr_read(hp, tregs, MII_LPA); in set_happy_link_modes()
596 if (!(hp->sw_lpa & (LPA_10HALF | LPA_10FULL | LPA_100HALF | LPA_100FULL))) in set_happy_link_modes()
598 if (hp->sw_lpa & LPA_100FULL) in set_happy_link_modes()
600 else if (hp->sw_lpa & LPA_100HALF) in set_happy_link_modes()
602 else if (hp->sw_lpa & LPA_10FULL) in set_happy_link_modes()
608 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR); in set_happy_link_modes()
609 if (hp->sw_bmcr & BMCR_FULLDPLX) in set_happy_link_modes()
623 hme_write32(hp, hp->bigmacregs + BMAC_TXCFG, in set_happy_link_modes()
624 hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) & in set_happy_link_modes()
626 while (hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) & BIGMAC_TXCFG_ENABLE) in set_happy_link_modes()
629 hp->happy_flags |= HFLAG_FULL; in set_happy_link_modes()
630 hme_write32(hp, hp->bigmacregs + BMAC_TXCFG, in set_happy_link_modes()
631 hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) | in set_happy_link_modes()
634 hp->happy_flags &= ~(HFLAG_FULL); in set_happy_link_modes()
635 hme_write32(hp, hp->bigmacregs + BMAC_TXCFG, in set_happy_link_modes()
636 hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) & in set_happy_link_modes()
639 hme_write32(hp, hp->bigmacregs + BMAC_TXCFG, in set_happy_link_modes()
640 hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) | in set_happy_link_modes()
651 void __iomem *tregs = hp->tcvregs; in is_lucent_phy()
667 void __iomem *tregs = hp->tcvregs; in happy_meal_timer()
670 spin_lock_irq(&hp->happy_lock); in happy_meal_timer()
672 hp->timer_ticks++; in happy_meal_timer()
673 switch(hp->timer_state) { in happy_meal_timer()
678 if (hp->timer_ticks >= 10) { in happy_meal_timer()
681 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR); in happy_meal_timer()
682 printk(KERN_NOTICE "%s: Auto-Negotiation unsuccessful, trying force link mode\n", in happy_meal_timer()
683 hp->dev->name); in happy_meal_timer()
684 hp->sw_bmcr = BMCR_SPEED100; in happy_meal_timer()
685 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in happy_meal_timer()
692 hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs, DP83840_CSCONFIG); in happy_meal_timer()
693 hp->sw_csconfig &= ~(CSCONFIG_TCVDISAB); in happy_meal_timer()
694 happy_meal_tcvr_write(hp, tregs, DP83840_CSCONFIG, hp->sw_csconfig); in happy_meal_timer()
696 hp->timer_state = ltrywait; in happy_meal_timer()
697 hp->timer_ticks = 0; in happy_meal_timer()
701 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR); in happy_meal_timer()
702 if (hp->sw_bmsr & BMSR_ANEGCOMPLETE) { in happy_meal_timer()
712 * XXX auto-negotiation make this happen as well. in happy_meal_timer()
718 hp->timer_state = lupwait; in happy_meal_timer()
732 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR); in happy_meal_timer()
733 if (hp->sw_bmsr & BMSR_LSTATUS) { in happy_meal_timer()
738 hp->timer_state = asleep; in happy_meal_timer()
741 if (hp->timer_ticks >= 10) { in happy_meal_timer()
743 "not completely up.\n", hp->dev->name); in happy_meal_timer()
744 hp->timer_ticks = 0; in happy_meal_timer()
758 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR); in happy_meal_timer()
759 hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs, DP83840_CSCONFIG); in happy_meal_timer()
760 if (hp->timer_ticks == 1) { in happy_meal_timer()
762 /* Re-enable transceiver, we'll re-enable the transceiver next in happy_meal_timer()
765 hp->sw_csconfig |= CSCONFIG_TCVDISAB; in happy_meal_timer()
767 DP83840_CSCONFIG, hp->sw_csconfig); in happy_meal_timer()
772 if (hp->timer_ticks == 2) { in happy_meal_timer()
774 hp->sw_csconfig &= ~(CSCONFIG_TCVDISAB); in happy_meal_timer()
776 DP83840_CSCONFIG, hp->sw_csconfig); in happy_meal_timer()
781 if (hp->sw_bmsr & BMSR_LSTATUS) { in happy_meal_timer()
785 hp->timer_state = asleep; in happy_meal_timer()
788 if (hp->timer_ticks >= 4) { /* 6 seconds or so... */ in happy_meal_timer()
792 if (ret == -1) { in happy_meal_timer()
799 hp->dev->name); in happy_meal_timer()
804 printk(KERN_ERR "%s: Error, cannot re-init the " in happy_meal_timer()
805 "Happy Meal.\n", hp->dev->name); in happy_meal_timer()
810 hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs, in happy_meal_timer()
812 hp->sw_csconfig |= CSCONFIG_TCVDISAB; in happy_meal_timer()
814 DP83840_CSCONFIG, hp->sw_csconfig); in happy_meal_timer()
816 hp->timer_ticks = 0; in happy_meal_timer()
828 hp->dev->name); in happy_meal_timer()
830 hp->timer_ticks = 0; in happy_meal_timer()
831 hp->timer_state = asleep; /* foo on you */ in happy_meal_timer()
836 hp->happy_timer.expires = jiffies + ((12 * HZ)/10); /* 1.2 sec. */ in happy_meal_timer()
837 add_timer(&hp->happy_timer); in happy_meal_timer()
841 spin_unlock_irq(&hp->happy_lock); in happy_meal_timer()
847 /* hp->happy_lock must be held */
856 while ((hme_read32(hp, bregs + BMAC_TXSWRESET) & 1) && --tries) in happy_meal_tx_reset()
867 /* hp->happy_lock must be held */
876 while ((hme_read32(hp, bregs + BMAC_RXSWRESET) & 1) && --tries) in happy_meal_rx_reset()
889 /* hp->happy_lock must be held */
898 while (hme_read32(hp, gregs + GREG_SWRESET) && --tries) in happy_meal_stop()
909 /* hp->happy_lock must be held */
912 struct net_device_stats *stats = &hp->dev->stats; in happy_meal_get_counters()
914 stats->rx_crc_errors += hme_read32(hp, bregs + BMAC_RCRCECTR); in happy_meal_get_counters()
917 stats->rx_frame_errors += hme_read32(hp, bregs + BMAC_UNALECTR); in happy_meal_get_counters()
920 stats->rx_length_errors += hme_read32(hp, bregs + BMAC_GLECTR); in happy_meal_get_counters()
923 stats->tx_aborted_errors += hme_read32(hp, bregs + BMAC_EXCTR); in happy_meal_get_counters()
925 stats->collisions += in happy_meal_get_counters()
932 /* hp->happy_lock must be held */
938 if ((hp->happy_flags & (HFLAG_POLLENABLE | HFLAG_POLL)) != in happy_meal_poll_stop()
954 hp->happy_flags &= ~(HFLAG_POLL); in happy_meal_poll_stop()
965 #define TCVR_UNISOLATE_TRIES 32 /* Dis-isolation can take longer. */
967 /* hp->happy_lock must be held */
975 if (hp->tcvr_type == external) { in happy_meal_tcvr_reset()
978 hp->tcvr_type = internal; in happy_meal_tcvr_reset()
979 hp->paddr = TCV_PADDR_ITX; in happy_meal_tcvr_reset()
986 return -1; in happy_meal_tcvr_reset()
990 hp->tcvr_type = external; in happy_meal_tcvr_reset()
991 hp->paddr = TCV_PADDR_ETX; in happy_meal_tcvr_reset()
1002 return -1; in happy_meal_tcvr_reset()
1006 hp->tcvr_type = internal; in happy_meal_tcvr_reset()
1007 hp->paddr = TCV_PADDR_ITX; in happy_meal_tcvr_reset()
1014 while (--tries) { in happy_meal_tcvr_reset()
1017 return -1; in happy_meal_tcvr_reset()
1018 hp->sw_bmcr = result; in happy_meal_tcvr_reset()
1025 return -1; in happy_meal_tcvr_reset()
1030 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR); in happy_meal_tcvr_reset()
1031 hp->sw_physid1 = happy_meal_tcvr_read(hp, tregs, MII_PHYSID1); in happy_meal_tcvr_reset()
1032 hp->sw_physid2 = happy_meal_tcvr_read(hp, tregs, MII_PHYSID2); in happy_meal_tcvr_reset()
1033 hp->sw_advertise = happy_meal_tcvr_read(hp, tregs, MII_ADVERTISE); in happy_meal_tcvr_reset()
1036 hp->sw_bmcr &= ~(BMCR_ISOLATE); in happy_meal_tcvr_reset()
1037 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in happy_meal_tcvr_reset()
1040 while (--tries) { in happy_meal_tcvr_reset()
1043 return -1; in happy_meal_tcvr_reset()
1050 return -1; in happy_meal_tcvr_reset()
1064 * hp->happy_lock must be held
1071 if (hp->happy_flags & HFLAG_POLL) { in happy_meal_transceiver_check()
1074 if (hp->tcvr_type == internal) { in happy_meal_transceiver_check()
1078 hp->paddr = TCV_PADDR_ETX; in happy_meal_transceiver_check()
1079 hp->tcvr_type = external; in happy_meal_transceiver_check()
1086 if (hp->tcvr_type == external) { in happy_meal_transceiver_check()
1091 hp->paddr = TCV_PADDR_ITX; in happy_meal_transceiver_check()
1092 hp->tcvr_type = internal; in happy_meal_transceiver_check()
1110 hp->paddr = TCV_PADDR_ETX; in happy_meal_transceiver_check()
1111 hp->tcvr_type = external; in happy_meal_transceiver_check()
1117 hp->paddr = TCV_PADDR_ITX; in happy_meal_transceiver_check()
1118 hp->tcvr_type = internal; in happy_meal_transceiver_check()
1122 hp->tcvr_type = none; /* Grrr... */ in happy_meal_transceiver_check()
1136 * also program the etxregs->cfg register to use an offset of 2. This
1157 * this from the skb->length. Then we just pass the packet up to the
1168 * skb->csum = rxd->rx_flags & 0xffff;
1169 * skb->ip_summed = CHECKSUM_COMPLETE;
1178 if (hp->rx_skbs[i] != NULL) { in happy_meal_clean_rings()
1179 struct sk_buff *skb = hp->rx_skbs[i]; in happy_meal_clean_rings()
1183 rxd = &hp->happy_block->happy_meal_rxd[i]; in happy_meal_clean_rings()
1184 dma_addr = hme_read_desc32(hp, &rxd->rx_addr); in happy_meal_clean_rings()
1185 dma_unmap_single(hp->dma_dev, dma_addr, in happy_meal_clean_rings()
1188 hp->rx_skbs[i] = NULL; in happy_meal_clean_rings()
1193 if (hp->tx_skbs[i] != NULL) { in happy_meal_clean_rings()
1194 struct sk_buff *skb = hp->tx_skbs[i]; in happy_meal_clean_rings()
1199 hp->tx_skbs[i] = NULL; in happy_meal_clean_rings()
1201 for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) { in happy_meal_clean_rings()
1202 txd = &hp->happy_block->happy_meal_txd[i]; in happy_meal_clean_rings()
1203 dma_addr = hme_read_desc32(hp, &txd->tx_addr); in happy_meal_clean_rings()
1205 dma_unmap_single(hp->dma_dev, dma_addr, in happy_meal_clean_rings()
1206 (hme_read_desc32(hp, &txd->tx_flags) in happy_meal_clean_rings()
1210 dma_unmap_page(hp->dma_dev, dma_addr, in happy_meal_clean_rings()
1211 (hme_read_desc32(hp, &txd->tx_flags) in happy_meal_clean_rings()
1215 if (frag != skb_shinfo(skb)->nr_frags) in happy_meal_clean_rings()
1224 /* hp->happy_lock must be held */
1227 struct hmeal_init_block *hb = hp->happy_block; in happy_meal_init_rings()
1231 hp->rx_new = hp->rx_old = hp->tx_new = hp->tx_old = 0; in happy_meal_init_rings()
1245 hme_write_rxd(hp, &hb->happy_meal_rxd[i], 0, 0); in happy_meal_init_rings()
1248 hp->rx_skbs[i] = skb; in happy_meal_init_rings()
1252 mapping = dma_map_single(hp->dma_dev, skb->data, RX_BUF_ALLOC_SIZE, in happy_meal_init_rings()
1254 if (dma_mapping_error(hp->dma_dev, mapping)) { in happy_meal_init_rings()
1256 hme_write_rxd(hp, &hb->happy_meal_rxd[i], 0, 0); in happy_meal_init_rings()
1259 hme_write_rxd(hp, &hb->happy_meal_rxd[i], in happy_meal_init_rings()
1260 (RXFLAG_OWN | ((RX_BUF_ALLOC_SIZE - RX_OFFSET) << 16)), in happy_meal_init_rings()
1267 hme_write_txd(hp, &hb->happy_meal_txd[i], 0, 0); in happy_meal_init_rings()
1272 /* hp->happy_lock must be held */
1281 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR); in happy_meal_begin_auto_negotiation()
1282 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR); in happy_meal_begin_auto_negotiation()
1283 hp->sw_physid1 = happy_meal_tcvr_read(hp, tregs, MII_PHYSID1); in happy_meal_begin_auto_negotiation()
1284 hp->sw_physid2 = happy_meal_tcvr_read(hp, tregs, MII_PHYSID2); in happy_meal_begin_auto_negotiation()
1288 hp->sw_advertise = happy_meal_tcvr_read(hp, tregs, MII_ADVERTISE); in happy_meal_begin_auto_negotiation()
1289 if (!ep || ep->base.autoneg == AUTONEG_ENABLE) { in happy_meal_begin_auto_negotiation()
1291 if (hp->sw_bmsr & BMSR_10HALF) in happy_meal_begin_auto_negotiation()
1292 hp->sw_advertise |= (ADVERTISE_10HALF); in happy_meal_begin_auto_negotiation()
1294 hp->sw_advertise &= ~(ADVERTISE_10HALF); in happy_meal_begin_auto_negotiation()
1296 if (hp->sw_bmsr & BMSR_10FULL) in happy_meal_begin_auto_negotiation()
1297 hp->sw_advertise |= (ADVERTISE_10FULL); in happy_meal_begin_auto_negotiation()
1299 hp->sw_advertise &= ~(ADVERTISE_10FULL); in happy_meal_begin_auto_negotiation()
1300 if (hp->sw_bmsr & BMSR_100HALF) in happy_meal_begin_auto_negotiation()
1301 hp->sw_advertise |= (ADVERTISE_100HALF); in happy_meal_begin_auto_negotiation()
1303 hp->sw_advertise &= ~(ADVERTISE_100HALF); in happy_meal_begin_auto_negotiation()
1304 if (hp->sw_bmsr & BMSR_100FULL) in happy_meal_begin_auto_negotiation()
1305 hp->sw_advertise |= (ADVERTISE_100FULL); in happy_meal_begin_auto_negotiation()
1307 hp->sw_advertise &= ~(ADVERTISE_100FULL); in happy_meal_begin_auto_negotiation()
1308 happy_meal_tcvr_write(hp, tregs, MII_ADVERTISE, hp->sw_advertise); in happy_meal_begin_auto_negotiation()
1317 ASD(("%s: Advertising [ ", hp->dev->name)); in happy_meal_begin_auto_negotiation()
1318 if (hp->sw_advertise & ADVERTISE_10HALF) in happy_meal_begin_auto_negotiation()
1320 if (hp->sw_advertise & ADVERTISE_10FULL) in happy_meal_begin_auto_negotiation()
1322 if (hp->sw_advertise & ADVERTISE_100HALF) in happy_meal_begin_auto_negotiation()
1324 if (hp->sw_advertise & ADVERTISE_100FULL) in happy_meal_begin_auto_negotiation()
1328 /* Enable Auto-Negotiation, this is usually on already... */ in happy_meal_begin_auto_negotiation()
1329 hp->sw_bmcr |= BMCR_ANENABLE; in happy_meal_begin_auto_negotiation()
1330 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in happy_meal_begin_auto_negotiation()
1333 hp->sw_bmcr |= BMCR_ANRESTART; in happy_meal_begin_auto_negotiation()
1334 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in happy_meal_begin_auto_negotiation()
1336 /* BMCR_ANRESTART self clears when the process has begun. */ in happy_meal_begin_auto_negotiation()
1339 while (--timeout) { in happy_meal_begin_auto_negotiation()
1340 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR); in happy_meal_begin_auto_negotiation()
1341 if (!(hp->sw_bmcr & BMCR_ANRESTART)) in happy_meal_begin_auto_negotiation()
1347 "BMCR=0x%04x\n", hp->dev->name, hp->sw_bmcr); in happy_meal_begin_auto_negotiation()
1349 hp->dev->name); in happy_meal_begin_auto_negotiation()
1352 hp->timer_state = arbwait; in happy_meal_begin_auto_negotiation()
1361 /* Disable auto-negotiation in BMCR, enable the duplex and in happy_meal_begin_auto_negotiation()
1364 if (!ep || ep->base.autoneg == AUTONEG_ENABLE) { in happy_meal_begin_auto_negotiation()
1365 hp->sw_bmcr = BMCR_SPEED100; in happy_meal_begin_auto_negotiation()
1367 if (ep->base.speed == SPEED_100) in happy_meal_begin_auto_negotiation()
1368 hp->sw_bmcr = BMCR_SPEED100; in happy_meal_begin_auto_negotiation()
1370 hp->sw_bmcr = 0; in happy_meal_begin_auto_negotiation()
1371 if (ep->base.duplex == DUPLEX_FULL) in happy_meal_begin_auto_negotiation()
1372 hp->sw_bmcr |= BMCR_FULLDPLX; in happy_meal_begin_auto_negotiation()
1374 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in happy_meal_begin_auto_negotiation()
1381 hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs, in happy_meal_begin_auto_negotiation()
1383 hp->sw_csconfig &= ~(CSCONFIG_TCVDISAB); in happy_meal_begin_auto_negotiation()
1385 hp->sw_csconfig); in happy_meal_begin_auto_negotiation()
1387 hp->timer_state = ltrywait; in happy_meal_begin_auto_negotiation()
1390 hp->timer_ticks = 0; in happy_meal_begin_auto_negotiation()
1391 hp->happy_timer.expires = jiffies + (12 * HZ)/10; /* 1.2 sec. */ in happy_meal_begin_auto_negotiation()
1392 add_timer(&hp->happy_timer); in happy_meal_begin_auto_negotiation()
1395 /* hp->happy_lock must be held */
1398 void __iomem *gregs = hp->gregs; in happy_meal_init()
1399 void __iomem *etxregs = hp->etxregs; in happy_meal_init()
1400 void __iomem *erxregs = hp->erxregs; in happy_meal_init()
1401 void __iomem *bregs = hp->bigmacregs; in happy_meal_init()
1402 void __iomem *tregs = hp->tcvregs; in happy_meal_init()
1404 unsigned char *e = &hp->dev->dev_addr[0]; in happy_meal_init()
1406 /* If auto-negotiation timer is running, kill it. */ in happy_meal_init()
1407 del_timer(&hp->happy_timer); in happy_meal_init()
1410 hp->happy_flags)); in happy_meal_init()
1411 if (!(hp->happy_flags & HFLAG_INIT)) { in happy_meal_init()
1413 hp->happy_flags |= HFLAG_INIT; in happy_meal_init()
1435 if (hp->happy_flags & HFLAG_FENABLE) { in happy_meal_init()
1453 switch(hp->tcvr_type) { in happy_meal_init()
1457 return -EAGAIN; in happy_meal_init()
1473 return -EAGAIN; in happy_meal_init()
1480 /* Set jam size and inter-packet gaps to reasonable defaults. */ in happy_meal_init()
1497 if ((hp->dev->flags & IFF_ALLMULTI) || in happy_meal_init()
1498 (netdev_mc_count(hp->dev) > 64)) { in happy_meal_init()
1503 } else if ((hp->dev->flags & IFF_PROMISC) == 0) { in happy_meal_init()
1509 netdev_for_each_mc_addr(ha, hp->dev) { in happy_meal_init()
1510 crc = ether_crc_le(6, ha->addr); in happy_meal_init()
1527 ((__u32)hp->hblock_dvma + hblock_offset(happy_meal_rxd, 0)), in happy_meal_init()
1528 ((__u32)hp->hblock_dvma + hblock_offset(happy_meal_txd, 0)))); in happy_meal_init()
1530 ((__u32)hp->hblock_dvma + hblock_offset(happy_meal_rxd, 0))); in happy_meal_init()
1532 ((__u32)hp->hblock_dvma + hblock_offset(happy_meal_txd, 0))); in happy_meal_init()
1540 ((__u32)hp->hblock_dvma + hblock_offset(happy_meal_rxd, 0))) in happy_meal_init()
1542 ((__u32)hp->hblock_dvma + hblock_offset(happy_meal_rxd, 0)) in happy_meal_init()
1553 if ((hp->happy_bursts & DMA_BURST64) && in happy_meal_init()
1554 ((hp->happy_flags & HFLAG_PCI) != 0 in happy_meal_init()
1563 * do not. -DaveM in happy_meal_init()
1566 if ((hp->happy_flags & HFLAG_PCI) == 0) { in happy_meal_init()
1567 struct platform_device *op = hp->happy_dev; in happy_meal_init()
1569 sbus_set_sbus64(&op->dev, in happy_meal_init()
1570 hp->happy_bursts); in happy_meal_init()
1578 } else if (hp->happy_bursts & DMA_BURST32) { in happy_meal_init()
1581 } else if (hp->happy_bursts & DMA_BURST16) { in happy_meal_init()
1599 hme_write32(hp, etxregs + ETX_RSIZE, (TX_RING_SIZE >> ETX_RSIZE_SHIFT) - 1); in happy_meal_init()
1628 if (hp->dev->flags & IFF_PROMISC) in happy_meal_init()
1638 if (hp->happy_flags & HFLAG_FULL) in happy_meal_init()
1653 if (hp->happy_flags & HFLAG_LANCE) in happy_meal_init()
1657 if (hp->tcvr_type == external) in happy_meal_init()
1685 /* hp->happy_lock must be held */
1688 void __iomem *tregs = hp->tcvregs; in happy_meal_set_initial_advertisement()
1689 void __iomem *bregs = hp->bigmacregs; in happy_meal_set_initial_advertisement()
1690 void __iomem *gregs = hp->gregs; in happy_meal_set_initial_advertisement()
1694 if (hp->happy_flags & HFLAG_FENABLE) in happy_meal_set_initial_advertisement()
1701 switch(hp->tcvr_type) { in happy_meal_set_initial_advertisement()
1715 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR); in happy_meal_set_initial_advertisement()
1716 hp->sw_advertise = happy_meal_tcvr_read(hp, tregs, MII_ADVERTISE); in happy_meal_set_initial_advertisement()
1719 if (hp->sw_bmsr & BMSR_10HALF) in happy_meal_set_initial_advertisement()
1720 hp->sw_advertise |= (ADVERTISE_10HALF); in happy_meal_set_initial_advertisement()
1722 hp->sw_advertise &= ~(ADVERTISE_10HALF); in happy_meal_set_initial_advertisement()
1724 if (hp->sw_bmsr & BMSR_10FULL) in happy_meal_set_initial_advertisement()
1725 hp->sw_advertise |= (ADVERTISE_10FULL); in happy_meal_set_initial_advertisement()
1727 hp->sw_advertise &= ~(ADVERTISE_10FULL); in happy_meal_set_initial_advertisement()
1728 if (hp->sw_bmsr & BMSR_100HALF) in happy_meal_set_initial_advertisement()
1729 hp->sw_advertise |= (ADVERTISE_100HALF); in happy_meal_set_initial_advertisement()
1731 hp->sw_advertise &= ~(ADVERTISE_100HALF); in happy_meal_set_initial_advertisement()
1732 if (hp->sw_bmsr & BMSR_100FULL) in happy_meal_set_initial_advertisement()
1733 hp->sw_advertise |= (ADVERTISE_100FULL); in happy_meal_set_initial_advertisement()
1735 hp->sw_advertise &= ~(ADVERTISE_100FULL); in happy_meal_set_initial_advertisement()
1738 happy_meal_tcvr_write(hp, tregs, MII_ADVERTISE, hp->sw_advertise); in happy_meal_set_initial_advertisement()
1742 * the hardware, so we cannot re-read it and get a correct value.
1744 * hp->happy_lock must be held
1750 /* Only print messages for non-counter related interrupts. */ in happy_meal_is_not_so_happy()
1758 hp->dev->name, status); in happy_meal_is_not_so_happy()
1763 printk(KERN_DEBUG "%s: Happy Meal receive FIFO overflow.\n", hp->dev->name); in happy_meal_is_not_so_happy()
1768 printk(KERN_ERR "%s: Happy Meal BigMAC SQE test failed.\n", hp->dev->name); in happy_meal_is_not_so_happy()
1775 hp->dev->name); in happy_meal_is_not_so_happy()
1783 printk(KERN_ERR "%s: Happy Meal MAX Packet size error.\n", hp->dev->name); in happy_meal_is_not_so_happy()
1795 hp->dev->name); in happy_meal_is_not_so_happy()
1800 printk(KERN_ERR "%s: Happy Meal rx DMA errors [ ", hp->dev->name); in happy_meal_is_not_so_happy()
1816 hp->dev->name); in happy_meal_is_not_so_happy()
1822 printk(KERN_ERR "%s: Happy Meal MIF interrupt.\n", hp->dev->name); in happy_meal_is_not_so_happy()
1828 printk(KERN_ERR "%s: Happy Meal tx DMA errors [ ", hp->dev->name); in happy_meal_is_not_so_happy()
1846 hp->dev->name, in happy_meal_is_not_so_happy()
1852 printk(KERN_NOTICE "%s: Resetting...\n", hp->dev->name); in happy_meal_is_not_so_happy()
1859 /* hp->happy_lock must be held */
1862 void __iomem *tregs = hp->tcvregs; in happy_meal_mif_interrupt()
1864 printk(KERN_INFO "%s: Link status change.\n", hp->dev->name); in happy_meal_mif_interrupt()
1865 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR); in happy_meal_mif_interrupt()
1866 hp->sw_lpa = happy_meal_tcvr_read(hp, tregs, MII_LPA); in happy_meal_mif_interrupt()
1869 if (hp->sw_lpa & LPA_100FULL) { in happy_meal_mif_interrupt()
1870 printk(KERN_INFO "%s: Switching to 100Mbps at full duplex.", hp->dev->name); in happy_meal_mif_interrupt()
1871 hp->sw_bmcr |= (BMCR_FULLDPLX | BMCR_SPEED100); in happy_meal_mif_interrupt()
1872 } else if (hp->sw_lpa & LPA_100HALF) { in happy_meal_mif_interrupt()
1873 printk(KERN_INFO "%s: Switching to 100MBps at half duplex.", hp->dev->name); in happy_meal_mif_interrupt()
1874 hp->sw_bmcr |= BMCR_SPEED100; in happy_meal_mif_interrupt()
1875 } else if (hp->sw_lpa & LPA_10FULL) { in happy_meal_mif_interrupt()
1876 printk(KERN_INFO "%s: Switching to 10MBps at full duplex.", hp->dev->name); in happy_meal_mif_interrupt()
1877 hp->sw_bmcr |= BMCR_FULLDPLX; in happy_meal_mif_interrupt()
1879 printk(KERN_INFO "%s: Using 10Mbps at half duplex.", hp->dev->name); in happy_meal_mif_interrupt()
1881 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr); in happy_meal_mif_interrupt()
1893 /* hp->happy_lock must be held */
1896 struct happy_meal_txd *txbase = &hp->happy_block->happy_meal_txd[0]; in happy_meal_tx()
1898 struct net_device *dev = hp->dev; in happy_meal_tx()
1901 elem = hp->tx_old; in happy_meal_tx()
1903 while (elem != hp->tx_new) { in happy_meal_tx()
1910 flags = hme_read_desc32(hp, &this->tx_flags); in happy_meal_tx()
1913 skb = hp->tx_skbs[elem]; in happy_meal_tx()
1914 if (skb_shinfo(skb)->nr_frags) { in happy_meal_tx()
1917 last = elem + skb_shinfo(skb)->nr_frags; in happy_meal_tx()
1918 last &= (TX_RING_SIZE - 1); in happy_meal_tx()
1923 hp->tx_skbs[elem] = NULL; in happy_meal_tx()
1924 dev->stats.tx_bytes += skb->len; in happy_meal_tx()
1926 for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) { in happy_meal_tx()
1927 dma_addr = hme_read_desc32(hp, &this->tx_addr); in happy_meal_tx()
1928 dma_len = hme_read_desc32(hp, &this->tx_flags); in happy_meal_tx()
1932 dma_unmap_single(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); in happy_meal_tx()
1934 dma_unmap_page(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); in happy_meal_tx()
1941 dev->stats.tx_packets++; in happy_meal_tx()
1943 hp->tx_old = elem; in happy_meal_tx()
1964 * hp->happy_lock must be held
1968 struct happy_meal_rxd *rxbase = &hp->happy_block->happy_meal_rxd[0]; in happy_meal_rx()
1970 int elem = hp->rx_new, drops = 0; in happy_meal_rx()
1975 while (!((flags = hme_read_desc32(hp, &this->rx_flags)) & RXFLAG_OWN)) { in happy_meal_rx()
1979 u32 dma_addr = hme_read_desc32(hp, &this->rx_addr); in happy_meal_rx()
1986 dev->stats.rx_errors++; in happy_meal_rx()
1988 dev->stats.rx_length_errors++; in happy_meal_rx()
1990 dev->stats.rx_over_errors++; in happy_meal_rx()
1991 dev->stats.rx_fifo_errors++; in happy_meal_rx()
1996 dev->stats.rx_dropped++; in happy_meal_rx()
1998 (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)), in happy_meal_rx()
2002 skb = hp->rx_skbs[elem]; in happy_meal_rx()
2014 mapping = dma_map_single(hp->dma_dev, new_skb->data, in happy_meal_rx()
2017 if (unlikely(dma_mapping_error(hp->dma_dev, mapping))) { in happy_meal_rx()
2023 dma_unmap_single(hp->dma_dev, dma_addr, RX_BUF_ALLOC_SIZE, DMA_FROM_DEVICE); in happy_meal_rx()
2024 hp->rx_skbs[elem] = new_skb; in happy_meal_rx()
2026 (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)), in happy_meal_rx()
2042 dma_sync_single_for_cpu(hp->dma_dev, dma_addr, len, DMA_FROM_DEVICE); in happy_meal_rx()
2043 skb_copy_from_linear_data(skb, copy_skb->data, len); in happy_meal_rx()
2044 dma_sync_single_for_device(hp->dma_dev, dma_addr, len, DMA_FROM_DEVICE); in happy_meal_rx()
2047 (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)), in happy_meal_rx()
2054 skb->csum = csum_unfold(~(__force __sum16)htons(csum)); in happy_meal_rx()
2055 skb->ip_summed = CHECKSUM_COMPLETE; in happy_meal_rx()
2058 skb->protocol = eth_type_trans(skb, dev); in happy_meal_rx()
2061 dev->stats.rx_packets++; in happy_meal_rx()
2062 dev->stats.rx_bytes += len; in happy_meal_rx()
2067 hp->rx_new = elem; in happy_meal_rx()
2069 printk(KERN_INFO "%s: Memory squeeze, deferring packet.\n", hp->dev->name); in happy_meal_rx()
2077 u32 happy_status = hme_read32(hp, hp->gregs + GREG_STAT); in happy_meal_interrupt()
2081 spin_lock(&hp->happy_lock); in happy_meal_interrupt()
2085 if (happy_meal_is_not_so_happy(hp, /* un- */ happy_status)) in happy_meal_interrupt()
2106 spin_unlock(&hp->happy_lock); in happy_meal_interrupt()
2118 struct net_device *dev = qp->happy_meals[i]; in quattro_sbus_interrupt()
2120 u32 happy_status = hme_read32(hp, hp->gregs + GREG_STAT); in quattro_sbus_interrupt()
2130 spin_lock(&hp->happy_lock); in quattro_sbus_interrupt()
2154 spin_unlock(&hp->happy_lock); in quattro_sbus_interrupt()
2172 if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) { in happy_meal_open()
2173 res = request_irq(hp->irq, happy_meal_interrupt, IRQF_SHARED, in happy_meal_open()
2174 dev->name, dev); in happy_meal_open()
2178 hp->irq); in happy_meal_open()
2180 return -EAGAIN; in happy_meal_open()
2186 spin_lock_irq(&hp->happy_lock); in happy_meal_open()
2188 spin_unlock_irq(&hp->happy_lock); in happy_meal_open()
2190 if (res && ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO)) in happy_meal_open()
2191 free_irq(hp->irq, dev); in happy_meal_open()
2199 spin_lock_irq(&hp->happy_lock); in happy_meal_close()
2200 happy_meal_stop(hp, hp->gregs); in happy_meal_close()
2203 /* If auto-negotiation timer is running, kill it. */ in happy_meal_close()
2204 del_timer(&hp->happy_timer); in happy_meal_close()
2206 spin_unlock_irq(&hp->happy_lock); in happy_meal_close()
2212 if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) in happy_meal_close()
2213 free_irq(hp->irq, dev); in happy_meal_close()
2228 printk (KERN_ERR "%s: transmit timed out, resetting\n", dev->name); in happy_meal_tx_timeout()
2230 printk (KERN_ERR "%s: Happy Status %08x TX[%08x:%08x]\n", dev->name, in happy_meal_tx_timeout()
2231 hme_read32(hp, hp->gregs + GREG_STAT), in happy_meal_tx_timeout()
2232 hme_read32(hp, hp->etxregs + ETX_CFG), in happy_meal_tx_timeout()
2233 hme_read32(hp, hp->bigmacregs + BMAC_TXCFG)); in happy_meal_tx_timeout()
2235 spin_lock_irq(&hp->happy_lock); in happy_meal_tx_timeout()
2237 spin_unlock_irq(&hp->happy_lock); in happy_meal_tx_timeout()
2245 struct happy_meal_txd *txbase = &hp->happy_block->happy_meal_txd[0]; in unmap_partial_tx_skb()
2247 dma_unmap_single(hp->dma_dev, first_mapping, first_len, DMA_TO_DEVICE); in unmap_partial_tx_skb()
2254 addr = hme_read_desc32(hp, &this->tx_addr); in unmap_partial_tx_skb()
2255 len = hme_read_desc32(hp, &this->tx_flags); in unmap_partial_tx_skb()
2257 dma_unmap_page(hp->dma_dev, addr, len, DMA_TO_DEVICE); in unmap_partial_tx_skb()
2269 if (skb->ip_summed == CHECKSUM_PARTIAL) { in happy_meal_start_xmit()
2271 const u32 csum_stuff_off = csum_start_off + skb->csum_offset; in happy_meal_start_xmit()
2278 spin_lock_irq(&hp->happy_lock); in happy_meal_start_xmit()
2280 if (TX_BUFFS_AVAIL(hp) <= (skb_shinfo(skb)->nr_frags + 1)) { in happy_meal_start_xmit()
2282 spin_unlock_irq(&hp->happy_lock); in happy_meal_start_xmit()
2284 dev->name); in happy_meal_start_xmit()
2288 entry = hp->tx_new; in happy_meal_start_xmit()
2290 hp->tx_skbs[entry] = skb; in happy_meal_start_xmit()
2292 if (skb_shinfo(skb)->nr_frags == 0) { in happy_meal_start_xmit()
2295 len = skb->len; in happy_meal_start_xmit()
2296 mapping = dma_map_single(hp->dma_dev, skb->data, len, DMA_TO_DEVICE); in happy_meal_start_xmit()
2297 if (unlikely(dma_mapping_error(hp->dma_dev, mapping))) in happy_meal_start_xmit()
2300 hme_write_txd(hp, &hp->happy_block->happy_meal_txd[entry], in happy_meal_start_xmit()
2312 first_mapping = dma_map_single(hp->dma_dev, skb->data, first_len, in happy_meal_start_xmit()
2314 if (unlikely(dma_mapping_error(hp->dma_dev, first_mapping))) in happy_meal_start_xmit()
2318 for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) { in happy_meal_start_xmit()
2319 const skb_frag_t *this_frag = &skb_shinfo(skb)->frags[frag]; in happy_meal_start_xmit()
2323 mapping = skb_frag_dma_map(hp->dma_dev, this_frag, in happy_meal_start_xmit()
2325 if (unlikely(dma_mapping_error(hp->dma_dev, mapping))) { in happy_meal_start_xmit()
2331 if (frag == skb_shinfo(skb)->nr_frags - 1) in happy_meal_start_xmit()
2333 hme_write_txd(hp, &hp->happy_block->happy_meal_txd[entry], in happy_meal_start_xmit()
2338 hme_write_txd(hp, &hp->happy_block->happy_meal_txd[first_entry], in happy_meal_start_xmit()
2343 hp->tx_new = entry; in happy_meal_start_xmit()
2349 hme_write32(hp, hp->etxregs + ETX_PENDING, ETX_TP_DMAWAKEUP); in happy_meal_start_xmit()
2351 spin_unlock_irq(&hp->happy_lock); in happy_meal_start_xmit()
2357 hp->tx_skbs[hp->tx_new] = NULL; in happy_meal_start_xmit()
2358 spin_unlock_irq(&hp->happy_lock); in happy_meal_start_xmit()
2361 dev->stats.tx_dropped++; in happy_meal_start_xmit()
2369 spin_lock_irq(&hp->happy_lock); in happy_meal_get_stats()
2370 happy_meal_get_counters(hp, hp->bigmacregs); in happy_meal_get_stats()
2371 spin_unlock_irq(&hp->happy_lock); in happy_meal_get_stats()
2373 return &dev->stats; in happy_meal_get_stats()
2379 void __iomem *bregs = hp->bigmacregs; in happy_meal_set_multicast()
2383 spin_lock_irq(&hp->happy_lock); in happy_meal_set_multicast()
2385 if ((dev->flags & IFF_ALLMULTI) || (netdev_mc_count(dev) > 64)) { in happy_meal_set_multicast()
2390 } else if (dev->flags & IFF_PROMISC) { in happy_meal_set_multicast()
2398 crc = ether_crc_le(6, ha->addr); in happy_meal_set_multicast()
2408 spin_unlock_irq(&hp->happy_lock); in happy_meal_set_multicast()
2425 cmd->base.port = PORT_TP; /* XXX no MII support */ in hme_get_link_ksettings()
2426 cmd->base.phy_address = 0; /* XXX fixed PHYAD */ in hme_get_link_ksettings()
2429 spin_lock_irq(&hp->happy_lock); in hme_get_link_ksettings()
2430 hp->sw_bmcr = happy_meal_tcvr_read(hp, hp->tcvregs, MII_BMCR); in hme_get_link_ksettings()
2431 hp->sw_lpa = happy_meal_tcvr_read(hp, hp->tcvregs, MII_LPA); in hme_get_link_ksettings()
2432 spin_unlock_irq(&hp->happy_lock); in hme_get_link_ksettings()
2434 if (hp->sw_bmcr & BMCR_ANENABLE) { in hme_get_link_ksettings()
2435 cmd->base.autoneg = AUTONEG_ENABLE; in hme_get_link_ksettings()
2436 speed = ((hp->sw_lpa & (LPA_100HALF | LPA_100FULL)) ? in hme_get_link_ksettings()
2439 cmd->base.duplex = in hme_get_link_ksettings()
2440 (hp->sw_lpa & (LPA_100FULL)) ? in hme_get_link_ksettings()
2443 cmd->base.duplex = in hme_get_link_ksettings()
2444 (hp->sw_lpa & (LPA_10FULL)) ? in hme_get_link_ksettings()
2447 cmd->base.autoneg = AUTONEG_DISABLE; in hme_get_link_ksettings()
2448 speed = (hp->sw_bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10; in hme_get_link_ksettings()
2449 cmd->base.duplex = in hme_get_link_ksettings()
2450 (hp->sw_bmcr & BMCR_FULLDPLX) ? in hme_get_link_ksettings()
2453 cmd->base.speed = speed; in hme_get_link_ksettings()
2454 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, in hme_get_link_ksettings()
2466 if (cmd->base.autoneg != AUTONEG_ENABLE && in hme_set_link_ksettings()
2467 cmd->base.autoneg != AUTONEG_DISABLE) in hme_set_link_ksettings()
2468 return -EINVAL; in hme_set_link_ksettings()
2469 if (cmd->base.autoneg == AUTONEG_DISABLE && in hme_set_link_ksettings()
2470 ((cmd->base.speed != SPEED_100 && in hme_set_link_ksettings()
2471 cmd->base.speed != SPEED_10) || in hme_set_link_ksettings()
2472 (cmd->base.duplex != DUPLEX_HALF && in hme_set_link_ksettings()
2473 cmd->base.duplex != DUPLEX_FULL))) in hme_set_link_ksettings()
2474 return -EINVAL; in hme_set_link_ksettings()
2477 spin_lock_irq(&hp->happy_lock); in hme_set_link_ksettings()
2478 del_timer(&hp->happy_timer); in hme_set_link_ksettings()
2479 happy_meal_begin_auto_negotiation(hp, hp->tcvregs, cmd); in hme_set_link_ksettings()
2480 spin_unlock_irq(&hp->happy_lock); in hme_set_link_ksettings()
2489 strlcpy(info->driver, "sunhme", sizeof(info->driver)); in hme_get_drvinfo()
2490 strlcpy(info->version, "2.02", sizeof(info->version)); in hme_get_drvinfo()
2491 if (hp->happy_flags & HFLAG_PCI) { in hme_get_drvinfo()
2492 struct pci_dev *pdev = hp->happy_dev; in hme_get_drvinfo()
2493 strlcpy(info->bus_info, pci_name(pdev), sizeof(info->bus_info)); in hme_get_drvinfo()
2498 struct platform_device *op = hp->happy_dev; in hme_get_drvinfo()
2499 regs = of_get_property(op->dev.of_node, "regs", NULL); in hme_get_drvinfo()
2501 snprintf(info->bus_info, sizeof(info->bus_info), in hme_get_drvinfo()
2503 regs->which_io); in hme_get_drvinfo()
2512 spin_lock_irq(&hp->happy_lock); in hme_get_link()
2513 hp->sw_bmcr = happy_meal_tcvr_read(hp, hp->tcvregs, MII_BMCR); in hme_get_link()
2514 spin_unlock_irq(&hp->happy_lock); in hme_get_link()
2516 return hp->sw_bmsr & BMSR_LSTATUS; in hme_get_link()
2536 struct device *parent = child->dev.parent; in quattro_sbus_find()
2550 qp->happy_meals[i] = NULL; in quattro_sbus_find()
2552 qp->quattro_dev = child; in quattro_sbus_find()
2553 qp->next = qfe_sbus_list; in quattro_sbus_find()
2569 for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) { in quattro_sbus_register_irqs()
2570 struct platform_device *op = qp->quattro_dev; in quattro_sbus_register_irqs()
2574 if (!qp->happy_meals[qfe_slot]) in quattro_sbus_register_irqs()
2580 err = request_irq(op->archdata.irqs[0], in quattro_sbus_register_irqs()
2598 for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) { in quattro_sbus_free_irqs()
2599 struct platform_device *op = qp->quattro_dev; in quattro_sbus_free_irqs()
2603 if (!qp->happy_meals[qfe_slot]) in quattro_sbus_free_irqs()
2609 free_irq(op->archdata.irqs[0], qp); in quattro_sbus_free_irqs()
2617 struct pci_dev *bdev = pdev->bus->self; in quattro_pci_find()
2621 for (qp = qfe_pci_list; qp != NULL; qp = qp->next) { in quattro_pci_find()
2622 struct pci_dev *qpdev = qp->quattro_dev; in quattro_pci_find()
2632 qp->happy_meals[i] = NULL; in quattro_pci_find()
2634 qp->quattro_dev = bdev; in quattro_pci_find()
2635 qp->next = qfe_pci_list; in quattro_pci_find()
2639 qp->nranges = 0; in quattro_pci_find()
2659 struct device_node *dp = op->dev.of_node, *sbus_dp; in happy_meal_sbus_probe_one()
2663 int i, qfe_slot = -1; in happy_meal_sbus_probe_one()
2664 int err = -ENODEV; in happy_meal_sbus_probe_one()
2666 sbus_dp = op->dev.parent->of_node; in happy_meal_sbus_probe_one()
2677 if (qp->happy_meals[qfe_slot] == NULL) in happy_meal_sbus_probe_one()
2683 err = -ENOMEM; in happy_meal_sbus_probe_one()
2687 SET_NETDEV_DEV(dev, &op->dev); in happy_meal_sbus_probe_one()
2693 * the Quattro local-mac-address property... in happy_meal_sbus_probe_one()
2701 dev->dev_addr[i] = macaddr[i]; in happy_meal_sbus_probe_one()
2707 addr = of_get_property(dp, "local-mac-address", &len); in happy_meal_sbus_probe_one()
2709 if (qfe_slot != -1 && addr && len == ETH_ALEN) in happy_meal_sbus_probe_one()
2710 memcpy(dev->dev_addr, addr, ETH_ALEN); in happy_meal_sbus_probe_one()
2712 memcpy(dev->dev_addr, idprom->id_ethaddr, ETH_ALEN); in happy_meal_sbus_probe_one()
2717 hp->happy_dev = op; in happy_meal_sbus_probe_one()
2718 hp->dma_dev = &op->dev; in happy_meal_sbus_probe_one()
2720 spin_lock_init(&hp->happy_lock); in happy_meal_sbus_probe_one()
2722 err = -ENODEV; in happy_meal_sbus_probe_one()
2724 hp->qfe_parent = qp; in happy_meal_sbus_probe_one()
2725 hp->qfe_ent = qfe_slot; in happy_meal_sbus_probe_one()
2726 qp->happy_meals[qfe_slot] = dev; in happy_meal_sbus_probe_one()
2729 hp->gregs = of_ioremap(&op->resource[0], 0, in happy_meal_sbus_probe_one()
2731 if (!hp->gregs) { in happy_meal_sbus_probe_one()
2736 hp->etxregs = of_ioremap(&op->resource[1], 0, in happy_meal_sbus_probe_one()
2738 if (!hp->etxregs) { in happy_meal_sbus_probe_one()
2743 hp->erxregs = of_ioremap(&op->resource[2], 0, in happy_meal_sbus_probe_one()
2745 if (!hp->erxregs) { in happy_meal_sbus_probe_one()
2750 hp->bigmacregs = of_ioremap(&op->resource[3], 0, in happy_meal_sbus_probe_one()
2752 if (!hp->bigmacregs) { in happy_meal_sbus_probe_one()
2757 hp->tcvregs = of_ioremap(&op->resource[4], 0, in happy_meal_sbus_probe_one()
2759 if (!hp->tcvregs) { in happy_meal_sbus_probe_one()
2764 hp->hm_revision = of_getintprop_default(dp, "hm-rev", 0xff); in happy_meal_sbus_probe_one()
2765 if (hp->hm_revision == 0xff) in happy_meal_sbus_probe_one()
2766 hp->hm_revision = 0xa0; in happy_meal_sbus_probe_one()
2769 if (hp->hm_revision == 0x20 || hp->hm_revision == 0x21) in happy_meal_sbus_probe_one()
2770 hp->happy_flags = HFLAG_20_21; in happy_meal_sbus_probe_one()
2771 else if (hp->hm_revision != 0xa0) in happy_meal_sbus_probe_one()
2772 hp->happy_flags = HFLAG_NOT_A0; in happy_meal_sbus_probe_one()
2775 hp->happy_flags |= HFLAG_QUATTRO; in happy_meal_sbus_probe_one()
2778 hp->happy_bursts = of_getintprop_default(sbus_dp, in happy_meal_sbus_probe_one()
2779 "burst-sizes", 0x00); in happy_meal_sbus_probe_one()
2781 hp->happy_block = dma_alloc_coherent(hp->dma_dev, in happy_meal_sbus_probe_one()
2783 &hp->hblock_dvma, in happy_meal_sbus_probe_one()
2785 err = -ENOMEM; in happy_meal_sbus_probe_one()
2786 if (!hp->happy_block) in happy_meal_sbus_probe_one()
2790 hp->linkcheck = 0; in happy_meal_sbus_probe_one()
2793 hp->timer_state = asleep; in happy_meal_sbus_probe_one()
2794 hp->timer_ticks = 0; in happy_meal_sbus_probe_one()
2796 timer_setup(&hp->happy_timer, happy_meal_timer, 0); in happy_meal_sbus_probe_one()
2798 hp->dev = dev; in happy_meal_sbus_probe_one()
2799 dev->netdev_ops = &hme_netdev_ops; in happy_meal_sbus_probe_one()
2800 dev->watchdog_timeo = 5*HZ; in happy_meal_sbus_probe_one()
2801 dev->ethtool_ops = &hme_ethtool_ops; in happy_meal_sbus_probe_one()
2804 dev->hw_features = NETIF_F_SG | NETIF_F_HW_CSUM; in happy_meal_sbus_probe_one()
2805 dev->features |= dev->hw_features | NETIF_F_RXCSUM; in happy_meal_sbus_probe_one()
2807 hp->irq = op->archdata.irqs[0]; in happy_meal_sbus_probe_one()
2811 hp->read_desc32 = sbus_hme_read_desc32; in happy_meal_sbus_probe_one()
2812 hp->write_txd = sbus_hme_write_txd; in happy_meal_sbus_probe_one()
2813 hp->write_rxd = sbus_hme_write_rxd; in happy_meal_sbus_probe_one()
2814 hp->read32 = sbus_hme_read32; in happy_meal_sbus_probe_one()
2815 hp->write32 = sbus_hme_write32; in happy_meal_sbus_probe_one()
2818 /* Grrr, Happy Meal comes up by default not advertising in happy_meal_sbus_probe_one()
2821 spin_lock_irq(&hp->happy_lock); in happy_meal_sbus_probe_one()
2823 spin_unlock_irq(&hp->happy_lock); in happy_meal_sbus_probe_one()
2825 err = register_netdev(hp->dev); in happy_meal_sbus_probe_one()
2834 if (qfe_slot != -1) in happy_meal_sbus_probe_one()
2836 dev->name, qfe_slot); in happy_meal_sbus_probe_one()
2839 dev->name); in happy_meal_sbus_probe_one()
2841 printk("%pM\n", dev->dev_addr); in happy_meal_sbus_probe_one()
2846 dma_free_coherent(hp->dma_dev, in happy_meal_sbus_probe_one()
2848 hp->happy_block, in happy_meal_sbus_probe_one()
2849 hp->hblock_dvma); in happy_meal_sbus_probe_one()
2852 if (hp->gregs) in happy_meal_sbus_probe_one()
2853 of_iounmap(&op->resource[0], hp->gregs, GREG_REG_SIZE); in happy_meal_sbus_probe_one()
2854 if (hp->etxregs) in happy_meal_sbus_probe_one()
2855 of_iounmap(&op->resource[1], hp->etxregs, ETX_REG_SIZE); in happy_meal_sbus_probe_one()
2856 if (hp->erxregs) in happy_meal_sbus_probe_one()
2857 of_iounmap(&op->resource[2], hp->erxregs, ERX_REG_SIZE); in happy_meal_sbus_probe_one()
2858 if (hp->bigmacregs) in happy_meal_sbus_probe_one()
2859 of_iounmap(&op->resource[3], hp->bigmacregs, BMAC_REG_SIZE); in happy_meal_sbus_probe_one()
2860 if (hp->tcvregs) in happy_meal_sbus_probe_one()
2861 of_iounmap(&op->resource[4], hp->tcvregs, TCVR_REG_SIZE); in happy_meal_sbus_probe_one()
2864 qp->happy_meals[qfe_slot] = NULL; in happy_meal_sbus_probe_one()
2878 struct pci_dev *busdev = pdev->bus->self; in is_quattro_p()
2883 busdev->vendor != PCI_VENDOR_ID_DEC || in is_quattro_p()
2884 busdev->device != PCI_DEVICE_ID_DEC_21153) in is_quattro_p()
2888 list_for_each_entry(this_pdev, &pdev->bus->devices, bus_list) { in is_quattro_p()
2889 if (this_pdev->vendor == PCI_VENDOR_ID_SUN && in is_quattro_p()
2890 this_pdev->device == PCI_DEVICE_ID_SUN_HAPPYMEAL) in is_quattro_p()
2926 index--; in find_eth_addr_in_vpd()
2941 index = PCI_SLOT(pdev->devfn); in get_hme_mac_nonsparc()
2970 int i, qfe_slot = -1; in happy_meal_pci_probe()
2985 err = -ENODEV; in happy_meal_pci_probe()
2996 if (qp->happy_meals[qfe_slot] == NULL) in happy_meal_pci_probe()
3003 err = -ENOMEM; in happy_meal_pci_probe()
3006 SET_NETDEV_DEV(dev, &pdev->dev); in happy_meal_pci_probe()
3013 hp->happy_dev = pdev; in happy_meal_pci_probe()
3014 hp->dma_dev = &pdev->dev; in happy_meal_pci_probe()
3016 spin_lock_init(&hp->happy_lock); in happy_meal_pci_probe()
3019 hp->qfe_parent = qp; in happy_meal_pci_probe()
3020 hp->qfe_ent = qfe_slot; in happy_meal_pci_probe()
3021 qp->happy_meals[qfe_slot] = dev; in happy_meal_pci_probe()
3025 err = -ENODEV; in happy_meal_pci_probe()
3047 dev->dev_addr[i] = macaddr[i]; in happy_meal_pci_probe()
3054 if (qfe_slot != -1 && in happy_meal_pci_probe()
3055 (addr = of_get_property(dp, "local-mac-address", &len)) in happy_meal_pci_probe()
3058 memcpy(dev->dev_addr, addr, ETH_ALEN); in happy_meal_pci_probe()
3060 memcpy(dev->dev_addr, idprom->id_ethaddr, ETH_ALEN); in happy_meal_pci_probe()
3063 get_hme_mac_nonsparc(pdev, &dev->dev_addr[0]); in happy_meal_pci_probe()
3068 hp->gregs = (hpreg_base + 0x0000UL); in happy_meal_pci_probe()
3069 hp->etxregs = (hpreg_base + 0x2000UL); in happy_meal_pci_probe()
3070 hp->erxregs = (hpreg_base + 0x4000UL); in happy_meal_pci_probe()
3071 hp->bigmacregs = (hpreg_base + 0x6000UL); in happy_meal_pci_probe()
3072 hp->tcvregs = (hpreg_base + 0x7000UL); in happy_meal_pci_probe()
3075 hp->hm_revision = of_getintprop_default(dp, "hm-rev", 0xff); in happy_meal_pci_probe()
3076 if (hp->hm_revision == 0xff) in happy_meal_pci_probe()
3077 hp->hm_revision = 0xc0 | (pdev->revision & 0x0f); in happy_meal_pci_probe()
3079 /* works with this on non-sparc hosts */ in happy_meal_pci_probe()
3080 hp->hm_revision = 0x20; in happy_meal_pci_probe()
3084 if (hp->hm_revision == 0x20 || hp->hm_revision == 0x21) in happy_meal_pci_probe()
3085 hp->happy_flags = HFLAG_20_21; in happy_meal_pci_probe()
3086 else if (hp->hm_revision != 0xa0 && hp->hm_revision != 0xc0) in happy_meal_pci_probe()
3087 hp->happy_flags = HFLAG_NOT_A0; in happy_meal_pci_probe()
3090 hp->happy_flags |= HFLAG_QUATTRO; in happy_meal_pci_probe()
3093 hp->happy_flags |= HFLAG_PCI; in happy_meal_pci_probe()
3097 hp->happy_bursts = DMA_BURSTBITS; in happy_meal_pci_probe()
3100 hp->happy_block = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, in happy_meal_pci_probe()
3101 &hp->hblock_dvma, GFP_KERNEL); in happy_meal_pci_probe()
3102 err = -ENODEV; in happy_meal_pci_probe()
3103 if (!hp->happy_block) in happy_meal_pci_probe()
3106 hp->linkcheck = 0; in happy_meal_pci_probe()
3107 hp->timer_state = asleep; in happy_meal_pci_probe()
3108 hp->timer_ticks = 0; in happy_meal_pci_probe()
3110 timer_setup(&hp->happy_timer, happy_meal_timer, 0); in happy_meal_pci_probe()
3112 hp->irq = pdev->irq; in happy_meal_pci_probe()
3113 hp->dev = dev; in happy_meal_pci_probe()
3114 dev->netdev_ops = &hme_netdev_ops; in happy_meal_pci_probe()
3115 dev->watchdog_timeo = 5*HZ; in happy_meal_pci_probe()
3116 dev->ethtool_ops = &hme_ethtool_ops; in happy_meal_pci_probe()
3119 dev->hw_features = NETIF_F_SG | NETIF_F_HW_CSUM; in happy_meal_pci_probe()
3120 dev->features |= dev->hw_features | NETIF_F_RXCSUM; in happy_meal_pci_probe()
3124 hp->read_desc32 = pci_hme_read_desc32; in happy_meal_pci_probe()
3125 hp->write_txd = pci_hme_write_txd; in happy_meal_pci_probe()
3126 hp->write_rxd = pci_hme_write_rxd; in happy_meal_pci_probe()
3127 hp->read32 = pci_hme_read32; in happy_meal_pci_probe()
3128 hp->write32 = pci_hme_write32; in happy_meal_pci_probe()
3131 /* Grrr, Happy Meal comes up by default not advertising in happy_meal_pci_probe()
3134 spin_lock_irq(&hp->happy_lock); in happy_meal_pci_probe()
3136 spin_unlock_irq(&hp->happy_lock); in happy_meal_pci_probe()
3138 err = register_netdev(hp->dev); in happy_meal_pci_probe()
3148 struct pci_dev *qpdev = qp->quattro_dev; in happy_meal_pci_probe()
3151 if (!strncmp(dev->name, "eth", 3)) { in happy_meal_pci_probe()
3152 int i = simple_strtoul(dev->name + 3, NULL, 10); in happy_meal_pci_probe()
3153 sprintf(prom_name, "-%d", i + 3); in happy_meal_pci_probe()
3155 printk(KERN_INFO "%s%s: Quattro HME (PCI/CheerIO) 10/100baseT Ethernet ", dev->name, prom_name); in happy_meal_pci_probe()
3156 if (qpdev->vendor == PCI_VENDOR_ID_DEC && in happy_meal_pci_probe()
3157 qpdev->device == PCI_DEVICE_ID_DEC_21153) in happy_meal_pci_probe()
3161 qpdev->vendor, qpdev->device); in happy_meal_pci_probe()
3164 if (qfe_slot != -1) in happy_meal_pci_probe()
3166 dev->name, qfe_slot); in happy_meal_pci_probe()
3169 dev->name); in happy_meal_pci_probe()
3171 printk("%pM\n", dev->dev_addr); in happy_meal_pci_probe()
3176 iounmap(hp->gregs); in happy_meal_pci_probe()
3183 qp->happy_meals[qfe_slot] = NULL; in happy_meal_pci_probe()
3194 struct net_device *net_dev = hp->dev; in happy_meal_pci_remove()
3198 dma_free_coherent(hp->dma_dev, PAGE_SIZE, in happy_meal_pci_remove()
3199 hp->happy_block, hp->hblock_dvma); in happy_meal_pci_remove()
3200 iounmap(hp->gregs); in happy_meal_pci_remove()
3201 pci_release_regions(hp->happy_dev); in happy_meal_pci_remove()
3231 struct quattro *next = qfe->next; in happy_meal_pci_exit()
3246 struct device_node *dp = op->dev.of_node; in hme_sbus_probe()
3250 match = of_match_device(hme_sbus_match, &op->dev); in hme_sbus_probe()
3252 return -EINVAL; in hme_sbus_probe()
3253 is_qfe = (match->data != NULL); in hme_sbus_probe()
3255 if (!is_qfe && model && !strcmp(model, "SUNW,sbus-qfe")) in hme_sbus_probe()
3264 struct net_device *net_dev = hp->dev; in hme_sbus_remove()
3270 of_iounmap(&op->resource[0], hp->gregs, GREG_REG_SIZE); in hme_sbus_remove()
3271 of_iounmap(&op->resource[1], hp->etxregs, ETX_REG_SIZE); in hme_sbus_remove()
3272 of_iounmap(&op->resource[2], hp->erxregs, ERX_REG_SIZE); in hme_sbus_remove()
3273 of_iounmap(&op->resource[3], hp->bigmacregs, BMAC_REG_SIZE); in hme_sbus_remove()
3274 of_iounmap(&op->resource[4], hp->tcvregs, TCVR_REG_SIZE); in hme_sbus_remove()
3275 dma_free_coherent(hp->dma_dev, in hme_sbus_remove()
3277 hp->happy_block, in hme_sbus_remove()
3278 hp->hblock_dvma); in hme_sbus_remove()
3329 struct quattro *next = qfe->next; in happy_meal_sbus_exit()