diff options
Diffstat (limited to 'drivers/net/ks8851.c')
-rw-r--r-- | drivers/net/ks8851.c | 448 |
1 files changed, 396 insertions, 52 deletions
diff --git a/drivers/net/ks8851.c b/drivers/net/ks8851.c index 9e9f9b349766..b4fb07a6f13f 100644 --- a/drivers/net/ks8851.c +++ b/drivers/net/ks8851.c | |||
@@ -9,6 +9,8 @@ | |||
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
13 | |||
12 | #define DEBUG | 14 | #define DEBUG |
13 | 15 | ||
14 | #include <linux/module.h> | 16 | #include <linux/module.h> |
@@ -76,7 +78,9 @@ union ks8851_tx_hdr { | |||
76 | * @msg_enable: The message flags controlling driver output (see ethtool). | 78 | * @msg_enable: The message flags controlling driver output (see ethtool). |
77 | * @fid: Incrementing frame id tag. | 79 | * @fid: Incrementing frame id tag. |
78 | * @rc_ier: Cached copy of KS_IER. | 80 | * @rc_ier: Cached copy of KS_IER. |
81 | * @rc_ccr: Cached copy of KS_CCR. | ||
79 | * @rc_rxqcr: Cached copy of KS_RXQCR. | 82 | * @rc_rxqcr: Cached copy of KS_RXQCR. |
83 | * @eeprom_size: Companion eeprom size in Bytes, 0 if no eeprom | ||
80 | * | 84 | * |
81 | * The @lock ensures that the chip is protected when certain operations are | 85 | * The @lock ensures that the chip is protected when certain operations are |
82 | * in progress. When the read or write packet transfer is in progress, most | 86 | * in progress. When the read or write packet transfer is in progress, most |
@@ -107,6 +111,8 @@ struct ks8851_net { | |||
107 | 111 | ||
108 | u16 rc_ier; | 112 | u16 rc_ier; |
109 | u16 rc_rxqcr; | 113 | u16 rc_rxqcr; |
114 | u16 rc_ccr; | ||
115 | u16 eeprom_size; | ||
110 | 116 | ||
111 | struct mii_if_info mii; | 117 | struct mii_if_info mii; |
112 | struct ks8851_rxctrl rxctrl; | 118 | struct ks8851_rxctrl rxctrl; |
@@ -125,11 +131,6 @@ struct ks8851_net { | |||
125 | 131 | ||
126 | static int msg_enable; | 132 | static int msg_enable; |
127 | 133 | ||
128 | #define ks_info(_ks, _msg...) dev_info(&(_ks)->spidev->dev, _msg) | ||
129 | #define ks_warn(_ks, _msg...) dev_warn(&(_ks)->spidev->dev, _msg) | ||
130 | #define ks_dbg(_ks, _msg...) dev_dbg(&(_ks)->spidev->dev, _msg) | ||
131 | #define ks_err(_ks, _msg...) dev_err(&(_ks)->spidev->dev, _msg) | ||
132 | |||
133 | /* shift for byte-enable data */ | 134 | /* shift for byte-enable data */ |
134 | #define BYTE_EN(_x) ((_x) << 2) | 135 | #define BYTE_EN(_x) ((_x) << 2) |
135 | 136 | ||
@@ -167,7 +168,7 @@ static void ks8851_wrreg16(struct ks8851_net *ks, unsigned reg, unsigned val) | |||
167 | 168 | ||
168 | ret = spi_sync(ks->spidev, msg); | 169 | ret = spi_sync(ks->spidev, msg); |
169 | if (ret < 0) | 170 | if (ret < 0) |
170 | ks_err(ks, "spi_sync() failed\n"); | 171 | netdev_err(ks->netdev, "spi_sync() failed\n"); |
171 | } | 172 | } |
172 | 173 | ||
173 | /** | 174 | /** |
@@ -197,7 +198,7 @@ static void ks8851_wrreg8(struct ks8851_net *ks, unsigned reg, unsigned val) | |||
197 | 198 | ||
198 | ret = spi_sync(ks->spidev, msg); | 199 | ret = spi_sync(ks->spidev, msg); |
199 | if (ret < 0) | 200 | if (ret < 0) |
200 | ks_err(ks, "spi_sync() failed\n"); | 201 | netdev_err(ks->netdev, "spi_sync() failed\n"); |
201 | } | 202 | } |
202 | 203 | ||
203 | /** | 204 | /** |
@@ -263,7 +264,7 @@ static void ks8851_rdreg(struct ks8851_net *ks, unsigned op, | |||
263 | 264 | ||
264 | ret = spi_sync(ks->spidev, msg); | 265 | ret = spi_sync(ks->spidev, msg); |
265 | if (ret < 0) | 266 | if (ret < 0) |
266 | ks_err(ks, "read: spi_sync() failed\n"); | 267 | netdev_err(ks->netdev, "read: spi_sync() failed\n"); |
267 | else if (ks8851_rx_1msg(ks)) | 268 | else if (ks8851_rx_1msg(ks)) |
268 | memcpy(rxb, trx + 2, rxl); | 269 | memcpy(rxb, trx + 2, rxl); |
269 | else | 270 | else |
@@ -417,8 +418,8 @@ static void ks8851_rdfifo(struct ks8851_net *ks, u8 *buff, unsigned len) | |||
417 | u8 txb[1]; | 418 | u8 txb[1]; |
418 | int ret; | 419 | int ret; |
419 | 420 | ||
420 | if (netif_msg_rx_status(ks)) | 421 | netif_dbg(ks, rx_status, ks->netdev, |
421 | ks_dbg(ks, "%s: %d@%p\n", __func__, len, buff); | 422 | "%s: %d@%p\n", __func__, len, buff); |
422 | 423 | ||
423 | /* set the operation we're issuing */ | 424 | /* set the operation we're issuing */ |
424 | txb[0] = KS_SPIOP_RXFIFO; | 425 | txb[0] = KS_SPIOP_RXFIFO; |
@@ -434,7 +435,7 @@ static void ks8851_rdfifo(struct ks8851_net *ks, u8 *buff, unsigned len) | |||
434 | 435 | ||
435 | ret = spi_sync(ks->spidev, msg); | 436 | ret = spi_sync(ks->spidev, msg); |
436 | if (ret < 0) | 437 | if (ret < 0) |
437 | ks_err(ks, "%s: spi_sync() failed\n", __func__); | 438 | netdev_err(ks->netdev, "%s: spi_sync() failed\n", __func__); |
438 | } | 439 | } |
439 | 440 | ||
440 | /** | 441 | /** |
@@ -446,10 +447,11 @@ static void ks8851_rdfifo(struct ks8851_net *ks, u8 *buff, unsigned len) | |||
446 | */ | 447 | */ |
447 | static void ks8851_dbg_dumpkkt(struct ks8851_net *ks, u8 *rxpkt) | 448 | static void ks8851_dbg_dumpkkt(struct ks8851_net *ks, u8 *rxpkt) |
448 | { | 449 | { |
449 | ks_dbg(ks, "pkt %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x\n", | 450 | netdev_dbg(ks->netdev, |
450 | rxpkt[4], rxpkt[5], rxpkt[6], rxpkt[7], | 451 | "pkt %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x\n", |
451 | rxpkt[8], rxpkt[9], rxpkt[10], rxpkt[11], | 452 | rxpkt[4], rxpkt[5], rxpkt[6], rxpkt[7], |
452 | rxpkt[12], rxpkt[13], rxpkt[14], rxpkt[15]); | 453 | rxpkt[8], rxpkt[9], rxpkt[10], rxpkt[11], |
454 | rxpkt[12], rxpkt[13], rxpkt[14], rxpkt[15]); | ||
453 | } | 455 | } |
454 | 456 | ||
455 | /** | 457 | /** |
@@ -471,8 +473,8 @@ static void ks8851_rx_pkts(struct ks8851_net *ks) | |||
471 | 473 | ||
472 | rxfc = ks8851_rdreg8(ks, KS_RXFC); | 474 | rxfc = ks8851_rdreg8(ks, KS_RXFC); |
473 | 475 | ||
474 | if (netif_msg_rx_status(ks)) | 476 | netif_dbg(ks, rx_status, ks->netdev, |
475 | ks_dbg(ks, "%s: %d packets\n", __func__, rxfc); | 477 | "%s: %d packets\n", __func__, rxfc); |
476 | 478 | ||
477 | /* Currently we're issuing a read per packet, but we could possibly | 479 | /* Currently we're issuing a read per packet, but we could possibly |
478 | * improve the code by issuing a single read, getting the receive | 480 | * improve the code by issuing a single read, getting the receive |
@@ -489,9 +491,8 @@ static void ks8851_rx_pkts(struct ks8851_net *ks) | |||
489 | rxstat = rxh & 0xffff; | 491 | rxstat = rxh & 0xffff; |
490 | rxlen = rxh >> 16; | 492 | rxlen = rxh >> 16; |
491 | 493 | ||
492 | if (netif_msg_rx_status(ks)) | 494 | netif_dbg(ks, rx_status, ks->netdev, |
493 | ks_dbg(ks, "rx: stat 0x%04x, len 0x%04x\n", | 495 | "rx: stat 0x%04x, len 0x%04x\n", rxstat, rxlen); |
494 | rxstat, rxlen); | ||
495 | 496 | ||
496 | /* the length of the packet includes the 32bit CRC */ | 497 | /* the length of the packet includes the 32bit CRC */ |
497 | 498 | ||
@@ -553,9 +554,8 @@ static void ks8851_irq_work(struct work_struct *work) | |||
553 | 554 | ||
554 | status = ks8851_rdreg16(ks, KS_ISR); | 555 | status = ks8851_rdreg16(ks, KS_ISR); |
555 | 556 | ||
556 | if (netif_msg_intr(ks)) | 557 | netif_dbg(ks, intr, ks->netdev, |
557 | dev_dbg(&ks->spidev->dev, "%s: status 0x%04x\n", | 558 | "%s: status 0x%04x\n", __func__, status); |
558 | __func__, status); | ||
559 | 559 | ||
560 | if (status & IRQ_LCI) { | 560 | if (status & IRQ_LCI) { |
561 | /* should do something about checking link status */ | 561 | /* should do something about checking link status */ |
@@ -582,8 +582,8 @@ static void ks8851_irq_work(struct work_struct *work) | |||
582 | * system */ | 582 | * system */ |
583 | ks->tx_space = ks8851_rdreg16(ks, KS_TXMIR); | 583 | ks->tx_space = ks8851_rdreg16(ks, KS_TXMIR); |
584 | 584 | ||
585 | if (netif_msg_intr(ks)) | 585 | netif_dbg(ks, intr, ks->netdev, |
586 | ks_dbg(ks, "%s: txspace %d\n", __func__, ks->tx_space); | 586 | "%s: txspace %d\n", __func__, ks->tx_space); |
587 | } | 587 | } |
588 | 588 | ||
589 | if (status & IRQ_RXI) | 589 | if (status & IRQ_RXI) |
@@ -659,9 +659,8 @@ static void ks8851_wrpkt(struct ks8851_net *ks, struct sk_buff *txp, bool irq) | |||
659 | unsigned fid = 0; | 659 | unsigned fid = 0; |
660 | int ret; | 660 | int ret; |
661 | 661 | ||
662 | if (netif_msg_tx_queued(ks)) | 662 | netif_dbg(ks, tx_queued, ks->netdev, "%s: skb %p, %d@%p, irq %d\n", |
663 | dev_dbg(&ks->spidev->dev, "%s: skb %p, %d@%p, irq %d\n", | 663 | __func__, txp, txp->len, txp->data, irq); |
664 | __func__, txp, txp->len, txp->data, irq); | ||
665 | 664 | ||
666 | fid = ks->fid++; | 665 | fid = ks->fid++; |
667 | fid &= TXFR_TXFID_MASK; | 666 | fid &= TXFR_TXFID_MASK; |
@@ -685,7 +684,7 @@ static void ks8851_wrpkt(struct ks8851_net *ks, struct sk_buff *txp, bool irq) | |||
685 | 684 | ||
686 | ret = spi_sync(ks->spidev, msg); | 685 | ret = spi_sync(ks->spidev, msg); |
687 | if (ret < 0) | 686 | if (ret < 0) |
688 | ks_err(ks, "%s: spi_sync() failed\n", __func__); | 687 | netdev_err(ks->netdev, "%s: spi_sync() failed\n", __func__); |
689 | } | 688 | } |
690 | 689 | ||
691 | /** | 690 | /** |
@@ -746,8 +745,7 @@ static void ks8851_set_powermode(struct ks8851_net *ks, unsigned pwrmode) | |||
746 | { | 745 | { |
747 | unsigned pmecr; | 746 | unsigned pmecr; |
748 | 747 | ||
749 | if (netif_msg_hw(ks)) | 748 | netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode); |
750 | ks_dbg(ks, "setting power mode %d\n", pwrmode); | ||
751 | 749 | ||
752 | pmecr = ks8851_rdreg16(ks, KS_PMECR); | 750 | pmecr = ks8851_rdreg16(ks, KS_PMECR); |
753 | pmecr &= ~PMECR_PM_MASK; | 751 | pmecr &= ~PMECR_PM_MASK; |
@@ -771,8 +769,7 @@ static int ks8851_net_open(struct net_device *dev) | |||
771 | * else at the moment */ | 769 | * else at the moment */ |
772 | mutex_lock(&ks->lock); | 770 | mutex_lock(&ks->lock); |
773 | 771 | ||
774 | if (netif_msg_ifup(ks)) | 772 | netif_dbg(ks, ifup, ks->netdev, "opening\n"); |
775 | ks_dbg(ks, "opening %s\n", dev->name); | ||
776 | 773 | ||
777 | /* bring chip out of any power saving mode it was in */ | 774 | /* bring chip out of any power saving mode it was in */ |
778 | ks8851_set_powermode(ks, PMECR_PM_NORMAL); | 775 | ks8851_set_powermode(ks, PMECR_PM_NORMAL); |
@@ -828,8 +825,7 @@ static int ks8851_net_open(struct net_device *dev) | |||
828 | 825 | ||
829 | netif_start_queue(ks->netdev); | 826 | netif_start_queue(ks->netdev); |
830 | 827 | ||
831 | if (netif_msg_ifup(ks)) | 828 | netif_dbg(ks, ifup, ks->netdev, "network device up\n"); |
832 | ks_dbg(ks, "network device %s up\n", dev->name); | ||
833 | 829 | ||
834 | mutex_unlock(&ks->lock); | 830 | mutex_unlock(&ks->lock); |
835 | return 0; | 831 | return 0; |
@@ -847,8 +843,7 @@ static int ks8851_net_stop(struct net_device *dev) | |||
847 | { | 843 | { |
848 | struct ks8851_net *ks = netdev_priv(dev); | 844 | struct ks8851_net *ks = netdev_priv(dev); |
849 | 845 | ||
850 | if (netif_msg_ifdown(ks)) | 846 | netif_info(ks, ifdown, dev, "shutting down\n"); |
851 | ks_info(ks, "%s: shutting down\n", dev->name); | ||
852 | 847 | ||
853 | netif_stop_queue(dev); | 848 | netif_stop_queue(dev); |
854 | 849 | ||
@@ -876,8 +871,8 @@ static int ks8851_net_stop(struct net_device *dev) | |||
876 | while (!skb_queue_empty(&ks->txq)) { | 871 | while (!skb_queue_empty(&ks->txq)) { |
877 | struct sk_buff *txb = skb_dequeue(&ks->txq); | 872 | struct sk_buff *txb = skb_dequeue(&ks->txq); |
878 | 873 | ||
879 | if (netif_msg_ifdown(ks)) | 874 | netif_dbg(ks, ifdown, ks->netdev, |
880 | ks_dbg(ks, "%s: freeing txb %p\n", __func__, txb); | 875 | "%s: freeing txb %p\n", __func__, txb); |
881 | 876 | ||
882 | dev_kfree_skb(txb); | 877 | dev_kfree_skb(txb); |
883 | } | 878 | } |
@@ -906,9 +901,8 @@ static netdev_tx_t ks8851_start_xmit(struct sk_buff *skb, | |||
906 | unsigned needed = calc_txlen(skb->len); | 901 | unsigned needed = calc_txlen(skb->len); |
907 | netdev_tx_t ret = NETDEV_TX_OK; | 902 | netdev_tx_t ret = NETDEV_TX_OK; |
908 | 903 | ||
909 | if (netif_msg_tx_queued(ks)) | 904 | netif_dbg(ks, tx_queued, ks->netdev, |
910 | ks_dbg(ks, "%s: skb %p, %d@%p\n", __func__, | 905 | "%s: skb %p, %d@%p\n", __func__, skb, skb->len, skb->data); |
911 | skb, skb->len, skb->data); | ||
912 | 906 | ||
913 | spin_lock(&ks->statelock); | 907 | spin_lock(&ks->statelock); |
914 | 908 | ||
@@ -968,13 +962,13 @@ static void ks8851_set_rx_mode(struct net_device *dev) | |||
968 | rxctrl.rxcr1 = (RXCR1_RXME | RXCR1_RXAE | | 962 | rxctrl.rxcr1 = (RXCR1_RXME | RXCR1_RXAE | |
969 | RXCR1_RXPAFMA | RXCR1_RXMAFMA); | 963 | RXCR1_RXPAFMA | RXCR1_RXMAFMA); |
970 | } else if (dev->flags & IFF_MULTICAST && !netdev_mc_empty(dev)) { | 964 | } else if (dev->flags & IFF_MULTICAST && !netdev_mc_empty(dev)) { |
971 | struct dev_mc_list *mcptr; | 965 | struct netdev_hw_addr *ha; |
972 | u32 crc; | 966 | u32 crc; |
973 | 967 | ||
974 | /* accept some multicast */ | 968 | /* accept some multicast */ |
975 | 969 | ||
976 | netdev_for_each_mc_addr(mcptr, dev) { | 970 | netdev_for_each_mc_addr(ha, dev) { |
977 | crc = ether_crc(ETH_ALEN, mcptr->dmi_addr); | 971 | crc = ether_crc(ETH_ALEN, ha->addr); |
978 | crc >>= (32 - 6); /* get top six bits */ | 972 | crc >>= (32 - 6); /* get top six bits */ |
979 | 973 | ||
980 | rxctrl.mchash[crc >> 4] |= (1 << (crc & 0xf)); | 974 | rxctrl.mchash[crc >> 4] |= (1 << (crc & 0xf)); |
@@ -1040,6 +1034,234 @@ static const struct net_device_ops ks8851_netdev_ops = { | |||
1040 | .ndo_validate_addr = eth_validate_addr, | 1034 | .ndo_validate_addr = eth_validate_addr, |
1041 | }; | 1035 | }; |
1042 | 1036 | ||
1037 | /* Companion eeprom access */ | ||
1038 | |||
1039 | enum { /* EEPROM programming states */ | ||
1040 | EEPROM_CONTROL, | ||
1041 | EEPROM_ADDRESS, | ||
1042 | EEPROM_DATA, | ||
1043 | EEPROM_COMPLETE | ||
1044 | }; | ||
1045 | |||
1046 | /** | ||
1047 | * ks8851_eeprom_read - read a 16bits word in ks8851 companion EEPROM | ||
1048 | * @dev: The network device the PHY is on. | ||
1049 | * @addr: EEPROM address to read | ||
1050 | * | ||
1051 | * eeprom_size: used to define the data coding length. Can be changed | ||
1052 | * through debug-fs. | ||
1053 | * | ||
1054 | * Programs a read on the EEPROM using ks8851 EEPROM SW access feature. | ||
1055 | * Warning: The READ feature is not supported on ks8851 revision 0. | ||
1056 | * | ||
1057 | * Rough programming model: | ||
1058 | * - on period start: set clock high and read value on bus | ||
1059 | * - on period / 2: set clock low and program value on bus | ||
1060 | * - start on period / 2 | ||
1061 | */ | ||
1062 | unsigned int ks8851_eeprom_read(struct net_device *dev, unsigned int addr) | ||
1063 | { | ||
1064 | struct ks8851_net *ks = netdev_priv(dev); | ||
1065 | int eepcr; | ||
1066 | int ctrl = EEPROM_OP_READ; | ||
1067 | int state = EEPROM_CONTROL; | ||
1068 | int bit_count = EEPROM_OP_LEN - 1; | ||
1069 | unsigned int data = 0; | ||
1070 | int dummy; | ||
1071 | unsigned int addr_len; | ||
1072 | |||
1073 | addr_len = (ks->eeprom_size == 128) ? 6 : 8; | ||
1074 | |||
1075 | /* start transaction: chip select high, authorize write */ | ||
1076 | mutex_lock(&ks->lock); | ||
1077 | eepcr = EEPCR_EESA | EEPCR_EESRWA; | ||
1078 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1079 | eepcr |= EEPCR_EECS; | ||
1080 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1081 | mutex_unlock(&ks->lock); | ||
1082 | |||
1083 | while (state != EEPROM_COMPLETE) { | ||
1084 | /* falling clock period starts... */ | ||
1085 | /* set EED_IO pin for control and address */ | ||
1086 | eepcr &= ~EEPCR_EEDO; | ||
1087 | switch (state) { | ||
1088 | case EEPROM_CONTROL: | ||
1089 | eepcr |= ((ctrl >> bit_count) & 1) << 2; | ||
1090 | if (bit_count-- <= 0) { | ||
1091 | bit_count = addr_len - 1; | ||
1092 | state = EEPROM_ADDRESS; | ||
1093 | } | ||
1094 | break; | ||
1095 | case EEPROM_ADDRESS: | ||
1096 | eepcr |= ((addr >> bit_count) & 1) << 2; | ||
1097 | bit_count--; | ||
1098 | break; | ||
1099 | case EEPROM_DATA: | ||
1100 | /* Change to receive mode */ | ||
1101 | eepcr &= ~EEPCR_EESRWA; | ||
1102 | break; | ||
1103 | } | ||
1104 | |||
1105 | /* lower clock */ | ||
1106 | eepcr &= ~EEPCR_EESCK; | ||
1107 | |||
1108 | mutex_lock(&ks->lock); | ||
1109 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1110 | mutex_unlock(&ks->lock); | ||
1111 | |||
1112 | /* waitread period / 2 */ | ||
1113 | udelay(EEPROM_SK_PERIOD / 2); | ||
1114 | |||
1115 | /* rising clock period starts... */ | ||
1116 | |||
1117 | /* raise clock */ | ||
1118 | mutex_lock(&ks->lock); | ||
1119 | eepcr |= EEPCR_EESCK; | ||
1120 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1121 | mutex_unlock(&ks->lock); | ||
1122 | |||
1123 | /* Manage read */ | ||
1124 | switch (state) { | ||
1125 | case EEPROM_ADDRESS: | ||
1126 | if (bit_count < 0) { | ||
1127 | bit_count = EEPROM_DATA_LEN - 1; | ||
1128 | state = EEPROM_DATA; | ||
1129 | } | ||
1130 | break; | ||
1131 | case EEPROM_DATA: | ||
1132 | mutex_lock(&ks->lock); | ||
1133 | dummy = ks8851_rdreg16(ks, KS_EEPCR); | ||
1134 | mutex_unlock(&ks->lock); | ||
1135 | data |= ((dummy >> EEPCR_EESB_OFFSET) & 1) << bit_count; | ||
1136 | if (bit_count-- <= 0) | ||
1137 | state = EEPROM_COMPLETE; | ||
1138 | break; | ||
1139 | } | ||
1140 | |||
1141 | /* wait period / 2 */ | ||
1142 | udelay(EEPROM_SK_PERIOD / 2); | ||
1143 | } | ||
1144 | |||
1145 | /* close transaction */ | ||
1146 | mutex_lock(&ks->lock); | ||
1147 | eepcr &= ~EEPCR_EECS; | ||
1148 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1149 | eepcr = 0; | ||
1150 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1151 | mutex_unlock(&ks->lock); | ||
1152 | |||
1153 | return data; | ||
1154 | } | ||
1155 | |||
1156 | /** | ||
1157 | * ks8851_eeprom_write - write a 16bits word in ks8851 companion EEPROM | ||
1158 | * @dev: The network device the PHY is on. | ||
1159 | * @op: operand (can be WRITE, EWEN, EWDS) | ||
1160 | * @addr: EEPROM address to write | ||
1161 | * @data: data to write | ||
1162 | * | ||
1163 | * eeprom_size: used to define the data coding length. Can be changed | ||
1164 | * through debug-fs. | ||
1165 | * | ||
1166 | * Programs a write on the EEPROM using ks8851 EEPROM SW access feature. | ||
1167 | * | ||
1168 | * Note that a write enable is required before writing data. | ||
1169 | * | ||
1170 | * Rough programming model: | ||
1171 | * - on period start: set clock high | ||
1172 | * - on period / 2: set clock low and program value on bus | ||
1173 | * - start on period / 2 | ||
1174 | */ | ||
1175 | void ks8851_eeprom_write(struct net_device *dev, unsigned int op, | ||
1176 | unsigned int addr, unsigned int data) | ||
1177 | { | ||
1178 | struct ks8851_net *ks = netdev_priv(dev); | ||
1179 | int eepcr; | ||
1180 | int state = EEPROM_CONTROL; | ||
1181 | int bit_count = EEPROM_OP_LEN - 1; | ||
1182 | unsigned int addr_len; | ||
1183 | |||
1184 | addr_len = (ks->eeprom_size == 128) ? 6 : 8; | ||
1185 | |||
1186 | switch (op) { | ||
1187 | case EEPROM_OP_EWEN: | ||
1188 | addr = 0x30; | ||
1189 | break; | ||
1190 | case EEPROM_OP_EWDS: | ||
1191 | addr = 0; | ||
1192 | break; | ||
1193 | } | ||
1194 | |||
1195 | /* start transaction: chip select high, authorize write */ | ||
1196 | mutex_lock(&ks->lock); | ||
1197 | eepcr = EEPCR_EESA | EEPCR_EESRWA; | ||
1198 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1199 | eepcr |= EEPCR_EECS; | ||
1200 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1201 | mutex_unlock(&ks->lock); | ||
1202 | |||
1203 | while (state != EEPROM_COMPLETE) { | ||
1204 | /* falling clock period starts... */ | ||
1205 | /* set EED_IO pin for control and address */ | ||
1206 | eepcr &= ~EEPCR_EEDO; | ||
1207 | switch (state) { | ||
1208 | case EEPROM_CONTROL: | ||
1209 | eepcr |= ((op >> bit_count) & 1) << 2; | ||
1210 | if (bit_count-- <= 0) { | ||
1211 | bit_count = addr_len - 1; | ||
1212 | state = EEPROM_ADDRESS; | ||
1213 | } | ||
1214 | break; | ||
1215 | case EEPROM_ADDRESS: | ||
1216 | eepcr |= ((addr >> bit_count) & 1) << 2; | ||
1217 | if (bit_count-- <= 0) { | ||
1218 | if (op == EEPROM_OP_WRITE) { | ||
1219 | bit_count = EEPROM_DATA_LEN - 1; | ||
1220 | state = EEPROM_DATA; | ||
1221 | } else { | ||
1222 | state = EEPROM_COMPLETE; | ||
1223 | } | ||
1224 | } | ||
1225 | break; | ||
1226 | case EEPROM_DATA: | ||
1227 | eepcr |= ((data >> bit_count) & 1) << 2; | ||
1228 | if (bit_count-- <= 0) | ||
1229 | state = EEPROM_COMPLETE; | ||
1230 | break; | ||
1231 | } | ||
1232 | |||
1233 | /* lower clock */ | ||
1234 | eepcr &= ~EEPCR_EESCK; | ||
1235 | |||
1236 | mutex_lock(&ks->lock); | ||
1237 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1238 | mutex_unlock(&ks->lock); | ||
1239 | |||
1240 | /* wait period / 2 */ | ||
1241 | udelay(EEPROM_SK_PERIOD / 2); | ||
1242 | |||
1243 | /* rising clock period starts... */ | ||
1244 | |||
1245 | /* raise clock */ | ||
1246 | eepcr |= EEPCR_EESCK; | ||
1247 | mutex_lock(&ks->lock); | ||
1248 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1249 | mutex_unlock(&ks->lock); | ||
1250 | |||
1251 | /* wait period / 2 */ | ||
1252 | udelay(EEPROM_SK_PERIOD / 2); | ||
1253 | } | ||
1254 | |||
1255 | /* close transaction */ | ||
1256 | mutex_lock(&ks->lock); | ||
1257 | eepcr &= ~EEPCR_EECS; | ||
1258 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1259 | eepcr = 0; | ||
1260 | ks8851_wrreg16(ks, KS_EEPCR, eepcr); | ||
1261 | mutex_unlock(&ks->lock); | ||
1262 | |||
1263 | } | ||
1264 | |||
1043 | /* ethtool support */ | 1265 | /* ethtool support */ |
1044 | 1266 | ||
1045 | static void ks8851_get_drvinfo(struct net_device *dev, | 1267 | static void ks8851_get_drvinfo(struct net_device *dev, |
@@ -1086,6 +1308,117 @@ static int ks8851_nway_reset(struct net_device *dev) | |||
1086 | return mii_nway_restart(&ks->mii); | 1308 | return mii_nway_restart(&ks->mii); |
1087 | } | 1309 | } |
1088 | 1310 | ||
1311 | static int ks8851_get_eeprom_len(struct net_device *dev) | ||
1312 | { | ||
1313 | struct ks8851_net *ks = netdev_priv(dev); | ||
1314 | return ks->eeprom_size; | ||
1315 | } | ||
1316 | |||
1317 | static int ks8851_get_eeprom(struct net_device *dev, | ||
1318 | struct ethtool_eeprom *eeprom, u8 *bytes) | ||
1319 | { | ||
1320 | struct ks8851_net *ks = netdev_priv(dev); | ||
1321 | u16 *eeprom_buff; | ||
1322 | int first_word; | ||
1323 | int last_word; | ||
1324 | int ret_val = 0; | ||
1325 | u16 i; | ||
1326 | |||
1327 | if (eeprom->len == 0) | ||
1328 | return -EINVAL; | ||
1329 | |||
1330 | if (eeprom->len > ks->eeprom_size) | ||
1331 | return -EINVAL; | ||
1332 | |||
1333 | eeprom->magic = ks8851_rdreg16(ks, KS_CIDER); | ||
1334 | |||
1335 | first_word = eeprom->offset >> 1; | ||
1336 | last_word = (eeprom->offset + eeprom->len - 1) >> 1; | ||
1337 | |||
1338 | eeprom_buff = kmalloc(sizeof(u16) * | ||
1339 | (last_word - first_word + 1), GFP_KERNEL); | ||
1340 | if (!eeprom_buff) | ||
1341 | return -ENOMEM; | ||
1342 | |||
1343 | for (i = 0; i < last_word - first_word + 1; i++) | ||
1344 | eeprom_buff[i] = ks8851_eeprom_read(dev, first_word + 1); | ||
1345 | |||
1346 | /* Device's eeprom is little-endian, word addressable */ | ||
1347 | for (i = 0; i < last_word - first_word + 1; i++) | ||
1348 | le16_to_cpus(&eeprom_buff[i]); | ||
1349 | |||
1350 | memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 1), eeprom->len); | ||
1351 | kfree(eeprom_buff); | ||
1352 | |||
1353 | return ret_val; | ||
1354 | } | ||
1355 | |||
1356 | static int ks8851_set_eeprom(struct net_device *dev, | ||
1357 | struct ethtool_eeprom *eeprom, u8 *bytes) | ||
1358 | { | ||
1359 | struct ks8851_net *ks = netdev_priv(dev); | ||
1360 | u16 *eeprom_buff; | ||
1361 | void *ptr; | ||
1362 | int max_len; | ||
1363 | int first_word; | ||
1364 | int last_word; | ||
1365 | int ret_val = 0; | ||
1366 | u16 i; | ||
1367 | |||
1368 | if (eeprom->len == 0) | ||
1369 | return -EOPNOTSUPP; | ||
1370 | |||
1371 | if (eeprom->len > ks->eeprom_size) | ||
1372 | return -EINVAL; | ||
1373 | |||
1374 | if (eeprom->magic != ks8851_rdreg16(ks, KS_CIDER)) | ||
1375 | return -EFAULT; | ||
1376 | |||
1377 | first_word = eeprom->offset >> 1; | ||
1378 | last_word = (eeprom->offset + eeprom->len - 1) >> 1; | ||
1379 | max_len = (last_word - first_word + 1) * 2; | ||
1380 | eeprom_buff = kmalloc(max_len, GFP_KERNEL); | ||
1381 | if (!eeprom_buff) | ||
1382 | return -ENOMEM; | ||
1383 | |||
1384 | ptr = (void *)eeprom_buff; | ||
1385 | |||
1386 | if (eeprom->offset & 1) { | ||
1387 | /* need read/modify/write of first changed EEPROM word */ | ||
1388 | /* only the second byte of the word is being modified */ | ||
1389 | eeprom_buff[0] = ks8851_eeprom_read(dev, first_word); | ||
1390 | ptr++; | ||
1391 | } | ||
1392 | if ((eeprom->offset + eeprom->len) & 1) | ||
1393 | /* need read/modify/write of last changed EEPROM word */ | ||
1394 | /* only the first byte of the word is being modified */ | ||
1395 | eeprom_buff[last_word - first_word] = | ||
1396 | ks8851_eeprom_read(dev, last_word); | ||
1397 | |||
1398 | |||
1399 | /* Device's eeprom is little-endian, word addressable */ | ||
1400 | le16_to_cpus(&eeprom_buff[0]); | ||
1401 | le16_to_cpus(&eeprom_buff[last_word - first_word]); | ||
1402 | |||
1403 | memcpy(ptr, bytes, eeprom->len); | ||
1404 | |||
1405 | for (i = 0; i < last_word - first_word + 1; i++) | ||
1406 | eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]); | ||
1407 | |||
1408 | ks8851_eeprom_write(dev, EEPROM_OP_EWEN, 0, 0); | ||
1409 | |||
1410 | for (i = 0; i < last_word - first_word + 1; i++) { | ||
1411 | ks8851_eeprom_write(dev, EEPROM_OP_WRITE, first_word + i, | ||
1412 | eeprom_buff[i]); | ||
1413 | mdelay(EEPROM_WRITE_TIME); | ||
1414 | } | ||
1415 | |||
1416 | ks8851_eeprom_write(dev, EEPROM_OP_EWDS, 0, 0); | ||
1417 | |||
1418 | kfree(eeprom_buff); | ||
1419 | return ret_val; | ||
1420 | } | ||
1421 | |||
1089 | static const struct ethtool_ops ks8851_ethtool_ops = { | 1422 | static const struct ethtool_ops ks8851_ethtool_ops = { |
1090 | .get_drvinfo = ks8851_get_drvinfo, | 1423 | .get_drvinfo = ks8851_get_drvinfo, |
1091 | .get_msglevel = ks8851_get_msglevel, | 1424 | .get_msglevel = ks8851_get_msglevel, |
@@ -1094,6 +1427,9 @@ static const struct ethtool_ops ks8851_ethtool_ops = { | |||
1094 | .set_settings = ks8851_set_settings, | 1427 | .set_settings = ks8851_set_settings, |
1095 | .get_link = ks8851_get_link, | 1428 | .get_link = ks8851_get_link, |
1096 | .nway_reset = ks8851_nway_reset, | 1429 | .nway_reset = ks8851_nway_reset, |
1430 | .get_eeprom_len = ks8851_get_eeprom_len, | ||
1431 | .get_eeprom = ks8851_get_eeprom, | ||
1432 | .set_eeprom = ks8851_set_eeprom, | ||
1097 | }; | 1433 | }; |
1098 | 1434 | ||
1099 | /* MII interface controls */ | 1435 | /* MII interface controls */ |
@@ -1187,17 +1523,17 @@ static int ks8851_read_selftest(struct ks8851_net *ks) | |||
1187 | rd = ks8851_rdreg16(ks, KS_MBIR); | 1523 | rd = ks8851_rdreg16(ks, KS_MBIR); |
1188 | 1524 | ||
1189 | if ((rd & both_done) != both_done) { | 1525 | if ((rd & both_done) != both_done) { |
1190 | ks_warn(ks, "Memory selftest not finished\n"); | 1526 | netdev_warn(ks->netdev, "Memory selftest not finished\n"); |
1191 | return 0; | 1527 | return 0; |
1192 | } | 1528 | } |
1193 | 1529 | ||
1194 | if (rd & MBIR_TXMBFA) { | 1530 | if (rd & MBIR_TXMBFA) { |
1195 | ks_err(ks, "TX memory selftest fail\n"); | 1531 | netdev_err(ks->netdev, "TX memory selftest fail\n"); |
1196 | ret |= 1; | 1532 | ret |= 1; |
1197 | } | 1533 | } |
1198 | 1534 | ||
1199 | if (rd & MBIR_RXMBFA) { | 1535 | if (rd & MBIR_RXMBFA) { |
1200 | ks_err(ks, "RX memory selftest fail\n"); | 1536 | netdev_err(ks->netdev, "RX memory selftest fail\n"); |
1201 | ret |= 2; | 1537 | ret |= 2; |
1202 | } | 1538 | } |
1203 | 1539 | ||
@@ -1279,6 +1615,14 @@ static int __devinit ks8851_probe(struct spi_device *spi) | |||
1279 | goto err_id; | 1615 | goto err_id; |
1280 | } | 1616 | } |
1281 | 1617 | ||
1618 | /* cache the contents of the CCR register for EEPROM, etc. */ | ||
1619 | ks->rc_ccr = ks8851_rdreg16(ks, KS_CCR); | ||
1620 | |||
1621 | if (ks->rc_ccr & CCR_EEPROM) | ||
1622 | ks->eeprom_size = 128; | ||
1623 | else | ||
1624 | ks->eeprom_size = 0; | ||
1625 | |||
1282 | ks8851_read_selftest(ks); | 1626 | ks8851_read_selftest(ks); |
1283 | ks8851_init_mac(ks); | 1627 | ks8851_init_mac(ks); |
1284 | 1628 | ||
@@ -1295,9 +1639,9 @@ static int __devinit ks8851_probe(struct spi_device *spi) | |||
1295 | goto err_netdev; | 1639 | goto err_netdev; |
1296 | } | 1640 | } |
1297 | 1641 | ||
1298 | dev_info(&spi->dev, "revision %d, MAC %pM, IRQ %d\n", | 1642 | netdev_info(ndev, "revision %d, MAC %pM, IRQ %d\n", |
1299 | CIDER_REV_GET(ks8851_rdreg16(ks, KS_CIDER)), | 1643 | CIDER_REV_GET(ks8851_rdreg16(ks, KS_CIDER)), |
1300 | ndev->dev_addr, ndev->irq); | 1644 | ndev->dev_addr, ndev->irq); |
1301 | 1645 | ||
1302 | return 0; | 1646 | return 0; |
1303 | 1647 | ||
@@ -1316,7 +1660,7 @@ static int __devexit ks8851_remove(struct spi_device *spi) | |||
1316 | struct ks8851_net *priv = dev_get_drvdata(&spi->dev); | 1660 | struct ks8851_net *priv = dev_get_drvdata(&spi->dev); |
1317 | 1661 | ||
1318 | if (netif_msg_drv(priv)) | 1662 | if (netif_msg_drv(priv)) |
1319 | dev_info(&spi->dev, "remove"); | 1663 | dev_info(&spi->dev, "remove\n"); |
1320 | 1664 | ||
1321 | unregister_netdev(priv->netdev); | 1665 | unregister_netdev(priv->netdev); |
1322 | free_irq(spi->irq, priv); | 1666 | free_irq(spi->irq, priv); |