diff options
Diffstat (limited to 'drivers/net/jme.c')
-rw-r--r-- | drivers/net/jme.c | 306 |
1 files changed, 231 insertions, 75 deletions
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index e97ebef3cf47..5b441b75e138 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c | |||
@@ -161,6 +161,67 @@ jme_setup_wakeup_frame(struct jme_adapter *jme, | |||
161 | } | 161 | } |
162 | 162 | ||
163 | static inline void | 163 | static inline void |
164 | jme_mac_rxclk_off(struct jme_adapter *jme) | ||
165 | { | ||
166 | jme->reg_gpreg1 |= GPREG1_RXCLKOFF; | ||
167 | jwrite32f(jme, JME_GPREG1, jme->reg_gpreg1); | ||
168 | } | ||
169 | |||
170 | static inline void | ||
171 | jme_mac_rxclk_on(struct jme_adapter *jme) | ||
172 | { | ||
173 | jme->reg_gpreg1 &= ~GPREG1_RXCLKOFF; | ||
174 | jwrite32f(jme, JME_GPREG1, jme->reg_gpreg1); | ||
175 | } | ||
176 | |||
177 | static inline void | ||
178 | jme_mac_txclk_off(struct jme_adapter *jme) | ||
179 | { | ||
180 | jme->reg_ghc &= ~(GHC_TO_CLK_SRC | GHC_TXMAC_CLK_SRC); | ||
181 | jwrite32f(jme, JME_GHC, jme->reg_ghc); | ||
182 | } | ||
183 | |||
184 | static inline void | ||
185 | jme_mac_txclk_on(struct jme_adapter *jme) | ||
186 | { | ||
187 | u32 speed = jme->reg_ghc & GHC_SPEED; | ||
188 | if (speed == GHC_SPEED_1000M) | ||
189 | jme->reg_ghc |= GHC_TO_CLK_GPHY | GHC_TXMAC_CLK_GPHY; | ||
190 | else | ||
191 | jme->reg_ghc |= GHC_TO_CLK_PCIE | GHC_TXMAC_CLK_PCIE; | ||
192 | jwrite32f(jme, JME_GHC, jme->reg_ghc); | ||
193 | } | ||
194 | |||
195 | static inline void | ||
196 | jme_reset_ghc_speed(struct jme_adapter *jme) | ||
197 | { | ||
198 | jme->reg_ghc &= ~(GHC_SPEED | GHC_DPX); | ||
199 | jwrite32f(jme, JME_GHC, jme->reg_ghc); | ||
200 | } | ||
201 | |||
202 | static inline void | ||
203 | jme_reset_250A2_workaround(struct jme_adapter *jme) | ||
204 | { | ||
205 | jme->reg_gpreg1 &= ~(GPREG1_HALFMODEPATCH | | ||
206 | GPREG1_RSSPATCH); | ||
207 | jwrite32(jme, JME_GPREG1, jme->reg_gpreg1); | ||
208 | } | ||
209 | |||
210 | static inline void | ||
211 | jme_assert_ghc_reset(struct jme_adapter *jme) | ||
212 | { | ||
213 | jme->reg_ghc |= GHC_SWRST; | ||
214 | jwrite32f(jme, JME_GHC, jme->reg_ghc); | ||
215 | } | ||
216 | |||
217 | static inline void | ||
218 | jme_clear_ghc_reset(struct jme_adapter *jme) | ||
219 | { | ||
220 | jme->reg_ghc &= ~GHC_SWRST; | ||
221 | jwrite32f(jme, JME_GHC, jme->reg_ghc); | ||
222 | } | ||
223 | |||
224 | static inline void | ||
164 | jme_reset_mac_processor(struct jme_adapter *jme) | 225 | jme_reset_mac_processor(struct jme_adapter *jme) |
165 | { | 226 | { |
166 | static const u32 mask[WAKEUP_FRAME_MASK_DWNR] = {0, 0, 0, 0}; | 227 | static const u32 mask[WAKEUP_FRAME_MASK_DWNR] = {0, 0, 0, 0}; |
@@ -168,9 +229,24 @@ jme_reset_mac_processor(struct jme_adapter *jme) | |||
168 | u32 gpreg0; | 229 | u32 gpreg0; |
169 | int i; | 230 | int i; |
170 | 231 | ||
171 | jwrite32(jme, JME_GHC, jme->reg_ghc | GHC_SWRST); | 232 | jme_reset_ghc_speed(jme); |
172 | udelay(2); | 233 | jme_reset_250A2_workaround(jme); |
173 | jwrite32(jme, JME_GHC, jme->reg_ghc); | 234 | |
235 | jme_mac_rxclk_on(jme); | ||
236 | jme_mac_txclk_on(jme); | ||
237 | udelay(1); | ||
238 | jme_assert_ghc_reset(jme); | ||
239 | udelay(1); | ||
240 | jme_mac_rxclk_off(jme); | ||
241 | jme_mac_txclk_off(jme); | ||
242 | udelay(1); | ||
243 | jme_clear_ghc_reset(jme); | ||
244 | udelay(1); | ||
245 | jme_mac_rxclk_on(jme); | ||
246 | jme_mac_txclk_on(jme); | ||
247 | udelay(1); | ||
248 | jme_mac_rxclk_off(jme); | ||
249 | jme_mac_txclk_off(jme); | ||
174 | 250 | ||
175 | jwrite32(jme, JME_RXDBA_LO, 0x00000000); | 251 | jwrite32(jme, JME_RXDBA_LO, 0x00000000); |
176 | jwrite32(jme, JME_RXDBA_HI, 0x00000000); | 252 | jwrite32(jme, JME_RXDBA_HI, 0x00000000); |
@@ -190,14 +266,6 @@ jme_reset_mac_processor(struct jme_adapter *jme) | |||
190 | else | 266 | else |
191 | gpreg0 = GPREG0_DEFAULT; | 267 | gpreg0 = GPREG0_DEFAULT; |
192 | jwrite32(jme, JME_GPREG0, gpreg0); | 268 | jwrite32(jme, JME_GPREG0, gpreg0); |
193 | jwrite32(jme, JME_GPREG1, GPREG1_DEFAULT); | ||
194 | } | ||
195 | |||
196 | static inline void | ||
197 | jme_reset_ghc_speed(struct jme_adapter *jme) | ||
198 | { | ||
199 | jme->reg_ghc &= ~(GHC_SPEED_1000M | GHC_DPX); | ||
200 | jwrite32(jme, JME_GHC, jme->reg_ghc); | ||
201 | } | 269 | } |
202 | 270 | ||
203 | static inline void | 271 | static inline void |
@@ -336,13 +404,13 @@ jme_linkstat_from_phy(struct jme_adapter *jme) | |||
336 | } | 404 | } |
337 | 405 | ||
338 | static inline void | 406 | static inline void |
339 | jme_set_phyfifoa(struct jme_adapter *jme) | 407 | jme_set_phyfifo_5level(struct jme_adapter *jme) |
340 | { | 408 | { |
341 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, 27, 0x0004); | 409 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, 27, 0x0004); |
342 | } | 410 | } |
343 | 411 | ||
344 | static inline void | 412 | static inline void |
345 | jme_set_phyfifob(struct jme_adapter *jme) | 413 | jme_set_phyfifo_8level(struct jme_adapter *jme) |
346 | { | 414 | { |
347 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, 27, 0x0000); | 415 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, 27, 0x0000); |
348 | } | 416 | } |
@@ -351,7 +419,7 @@ static int | |||
351 | jme_check_link(struct net_device *netdev, int testonly) | 419 | jme_check_link(struct net_device *netdev, int testonly) |
352 | { | 420 | { |
353 | struct jme_adapter *jme = netdev_priv(netdev); | 421 | struct jme_adapter *jme = netdev_priv(netdev); |
354 | u32 phylink, ghc, cnt = JME_SPDRSV_TIMEOUT, bmcr, gpreg1; | 422 | u32 phylink, cnt = JME_SPDRSV_TIMEOUT, bmcr; |
355 | char linkmsg[64]; | 423 | char linkmsg[64]; |
356 | int rc = 0; | 424 | int rc = 0; |
357 | 425 | ||
@@ -414,23 +482,21 @@ jme_check_link(struct net_device *netdev, int testonly) | |||
414 | 482 | ||
415 | jme->phylink = phylink; | 483 | jme->phylink = phylink; |
416 | 484 | ||
417 | ghc = jme->reg_ghc & ~(GHC_SPEED | GHC_DPX | | 485 | /* |
418 | GHC_TO_CLK_PCIE | GHC_TXMAC_CLK_PCIE | | 486 | * The speed/duplex setting of jme->reg_ghc already cleared |
419 | GHC_TO_CLK_GPHY | GHC_TXMAC_CLK_GPHY); | 487 | * by jme_reset_mac_processor() |
488 | */ | ||
420 | switch (phylink & PHY_LINK_SPEED_MASK) { | 489 | switch (phylink & PHY_LINK_SPEED_MASK) { |
421 | case PHY_LINK_SPEED_10M: | 490 | case PHY_LINK_SPEED_10M: |
422 | ghc |= GHC_SPEED_10M | | 491 | jme->reg_ghc |= GHC_SPEED_10M; |
423 | GHC_TO_CLK_PCIE | GHC_TXMAC_CLK_PCIE; | ||
424 | strcat(linkmsg, "10 Mbps, "); | 492 | strcat(linkmsg, "10 Mbps, "); |
425 | break; | 493 | break; |
426 | case PHY_LINK_SPEED_100M: | 494 | case PHY_LINK_SPEED_100M: |
427 | ghc |= GHC_SPEED_100M | | 495 | jme->reg_ghc |= GHC_SPEED_100M; |
428 | GHC_TO_CLK_PCIE | GHC_TXMAC_CLK_PCIE; | ||
429 | strcat(linkmsg, "100 Mbps, "); | 496 | strcat(linkmsg, "100 Mbps, "); |
430 | break; | 497 | break; |
431 | case PHY_LINK_SPEED_1000M: | 498 | case PHY_LINK_SPEED_1000M: |
432 | ghc |= GHC_SPEED_1000M | | 499 | jme->reg_ghc |= GHC_SPEED_1000M; |
433 | GHC_TO_CLK_GPHY | GHC_TXMAC_CLK_GPHY; | ||
434 | strcat(linkmsg, "1000 Mbps, "); | 500 | strcat(linkmsg, "1000 Mbps, "); |
435 | break; | 501 | break; |
436 | default: | 502 | default: |
@@ -439,42 +505,40 @@ jme_check_link(struct net_device *netdev, int testonly) | |||
439 | 505 | ||
440 | if (phylink & PHY_LINK_DUPLEX) { | 506 | if (phylink & PHY_LINK_DUPLEX) { |
441 | jwrite32(jme, JME_TXMCS, TXMCS_DEFAULT); | 507 | jwrite32(jme, JME_TXMCS, TXMCS_DEFAULT); |
442 | ghc |= GHC_DPX; | 508 | jwrite32(jme, JME_TXTRHD, TXTRHD_FULLDUPLEX); |
509 | jme->reg_ghc |= GHC_DPX; | ||
443 | } else { | 510 | } else { |
444 | jwrite32(jme, JME_TXMCS, TXMCS_DEFAULT | | 511 | jwrite32(jme, JME_TXMCS, TXMCS_DEFAULT | |
445 | TXMCS_BACKOFF | | 512 | TXMCS_BACKOFF | |
446 | TXMCS_CARRIERSENSE | | 513 | TXMCS_CARRIERSENSE | |
447 | TXMCS_COLLISION); | 514 | TXMCS_COLLISION); |
448 | jwrite32(jme, JME_TXTRHD, TXTRHD_TXPEN | | 515 | jwrite32(jme, JME_TXTRHD, TXTRHD_HALFDUPLEX); |
449 | ((0x2000 << TXTRHD_TXP_SHIFT) & TXTRHD_TXP) | | ||
450 | TXTRHD_TXREN | | ||
451 | ((8 << TXTRHD_TXRL_SHIFT) & TXTRHD_TXRL)); | ||
452 | } | 516 | } |
453 | 517 | ||
454 | gpreg1 = GPREG1_DEFAULT; | 518 | jwrite32(jme, JME_GHC, jme->reg_ghc); |
519 | |||
455 | if (is_buggy250(jme->pdev->device, jme->chiprev)) { | 520 | if (is_buggy250(jme->pdev->device, jme->chiprev)) { |
521 | jme->reg_gpreg1 &= ~(GPREG1_HALFMODEPATCH | | ||
522 | GPREG1_RSSPATCH); | ||
456 | if (!(phylink & PHY_LINK_DUPLEX)) | 523 | if (!(phylink & PHY_LINK_DUPLEX)) |
457 | gpreg1 |= GPREG1_HALFMODEPATCH; | 524 | jme->reg_gpreg1 |= GPREG1_HALFMODEPATCH; |
458 | switch (phylink & PHY_LINK_SPEED_MASK) { | 525 | switch (phylink & PHY_LINK_SPEED_MASK) { |
459 | case PHY_LINK_SPEED_10M: | 526 | case PHY_LINK_SPEED_10M: |
460 | jme_set_phyfifoa(jme); | 527 | jme_set_phyfifo_8level(jme); |
461 | gpreg1 |= GPREG1_RSSPATCH; | 528 | jme->reg_gpreg1 |= GPREG1_RSSPATCH; |
462 | break; | 529 | break; |
463 | case PHY_LINK_SPEED_100M: | 530 | case PHY_LINK_SPEED_100M: |
464 | jme_set_phyfifob(jme); | 531 | jme_set_phyfifo_5level(jme); |
465 | gpreg1 |= GPREG1_RSSPATCH; | 532 | jme->reg_gpreg1 |= GPREG1_RSSPATCH; |
466 | break; | 533 | break; |
467 | case PHY_LINK_SPEED_1000M: | 534 | case PHY_LINK_SPEED_1000M: |
468 | jme_set_phyfifoa(jme); | 535 | jme_set_phyfifo_8level(jme); |
469 | break; | 536 | break; |
470 | default: | 537 | default: |
471 | break; | 538 | break; |
472 | } | 539 | } |
473 | } | 540 | } |
474 | 541 | jwrite32(jme, JME_GPREG1, jme->reg_gpreg1); | |
475 | jwrite32(jme, JME_GPREG1, gpreg1); | ||
476 | jwrite32(jme, JME_GHC, ghc); | ||
477 | jme->reg_ghc = ghc; | ||
478 | 542 | ||
479 | strcat(linkmsg, (phylink & PHY_LINK_DUPLEX) ? | 543 | strcat(linkmsg, (phylink & PHY_LINK_DUPLEX) ? |
480 | "Full-Duplex, " : | 544 | "Full-Duplex, " : |
@@ -613,10 +677,14 @@ jme_enable_tx_engine(struct jme_adapter *jme) | |||
613 | * Enable TX Engine | 677 | * Enable TX Engine |
614 | */ | 678 | */ |
615 | wmb(); | 679 | wmb(); |
616 | jwrite32(jme, JME_TXCS, jme->reg_txcs | | 680 | jwrite32f(jme, JME_TXCS, jme->reg_txcs | |
617 | TXCS_SELECT_QUEUE0 | | 681 | TXCS_SELECT_QUEUE0 | |
618 | TXCS_ENABLE); | 682 | TXCS_ENABLE); |
619 | 683 | ||
684 | /* | ||
685 | * Start clock for TX MAC Processor | ||
686 | */ | ||
687 | jme_mac_txclk_on(jme); | ||
620 | } | 688 | } |
621 | 689 | ||
622 | static inline void | 690 | static inline void |
@@ -651,6 +719,11 @@ jme_disable_tx_engine(struct jme_adapter *jme) | |||
651 | 719 | ||
652 | if (!i) | 720 | if (!i) |
653 | pr_err("Disable TX engine timeout\n"); | 721 | pr_err("Disable TX engine timeout\n"); |
722 | |||
723 | /* | ||
724 | * Stop clock for TX MAC Processor | ||
725 | */ | ||
726 | jme_mac_txclk_off(jme); | ||
654 | } | 727 | } |
655 | 728 | ||
656 | static void | 729 | static void |
@@ -825,16 +898,22 @@ jme_enable_rx_engine(struct jme_adapter *jme) | |||
825 | /* | 898 | /* |
826 | * Setup Unicast Filter | 899 | * Setup Unicast Filter |
827 | */ | 900 | */ |
901 | jme_set_unicastaddr(jme->dev); | ||
828 | jme_set_multi(jme->dev); | 902 | jme_set_multi(jme->dev); |
829 | 903 | ||
830 | /* | 904 | /* |
831 | * Enable RX Engine | 905 | * Enable RX Engine |
832 | */ | 906 | */ |
833 | wmb(); | 907 | wmb(); |
834 | jwrite32(jme, JME_RXCS, jme->reg_rxcs | | 908 | jwrite32f(jme, JME_RXCS, jme->reg_rxcs | |
835 | RXCS_QUEUESEL_Q0 | | 909 | RXCS_QUEUESEL_Q0 | |
836 | RXCS_ENABLE | | 910 | RXCS_ENABLE | |
837 | RXCS_QST); | 911 | RXCS_QST); |
912 | |||
913 | /* | ||
914 | * Start clock for RX MAC Processor | ||
915 | */ | ||
916 | jme_mac_rxclk_on(jme); | ||
838 | } | 917 | } |
839 | 918 | ||
840 | static inline void | 919 | static inline void |
@@ -871,10 +950,40 @@ jme_disable_rx_engine(struct jme_adapter *jme) | |||
871 | if (!i) | 950 | if (!i) |
872 | pr_err("Disable RX engine timeout\n"); | 951 | pr_err("Disable RX engine timeout\n"); |
873 | 952 | ||
953 | /* | ||
954 | * Stop clock for RX MAC Processor | ||
955 | */ | ||
956 | jme_mac_rxclk_off(jme); | ||
957 | } | ||
958 | |||
959 | static u16 | ||
960 | jme_udpsum(struct sk_buff *skb) | ||
961 | { | ||
962 | u16 csum = 0xFFFFu; | ||
963 | |||
964 | if (skb->len < (ETH_HLEN + sizeof(struct iphdr))) | ||
965 | return csum; | ||
966 | if (skb->protocol != htons(ETH_P_IP)) | ||
967 | return csum; | ||
968 | skb_set_network_header(skb, ETH_HLEN); | ||
969 | if ((ip_hdr(skb)->protocol != IPPROTO_UDP) || | ||
970 | (skb->len < (ETH_HLEN + | ||
971 | (ip_hdr(skb)->ihl << 2) + | ||
972 | sizeof(struct udphdr)))) { | ||
973 | skb_reset_network_header(skb); | ||
974 | return csum; | ||
975 | } | ||
976 | skb_set_transport_header(skb, | ||
977 | ETH_HLEN + (ip_hdr(skb)->ihl << 2)); | ||
978 | csum = udp_hdr(skb)->check; | ||
979 | skb_reset_transport_header(skb); | ||
980 | skb_reset_network_header(skb); | ||
981 | |||
982 | return csum; | ||
874 | } | 983 | } |
875 | 984 | ||
876 | static int | 985 | static int |
877 | jme_rxsum_ok(struct jme_adapter *jme, u16 flags) | 986 | jme_rxsum_ok(struct jme_adapter *jme, u16 flags, struct sk_buff *skb) |
878 | { | 987 | { |
879 | if (!(flags & (RXWBFLAG_TCPON | RXWBFLAG_UDPON | RXWBFLAG_IPV4))) | 988 | if (!(flags & (RXWBFLAG_TCPON | RXWBFLAG_UDPON | RXWBFLAG_IPV4))) |
880 | return false; | 989 | return false; |
@@ -887,7 +996,7 @@ jme_rxsum_ok(struct jme_adapter *jme, u16 flags) | |||
887 | } | 996 | } |
888 | 997 | ||
889 | if (unlikely((flags & (RXWBFLAG_MF | RXWBFLAG_UDPON | RXWBFLAG_UDPCS)) | 998 | if (unlikely((flags & (RXWBFLAG_MF | RXWBFLAG_UDPON | RXWBFLAG_UDPCS)) |
890 | == RXWBFLAG_UDPON)) { | 999 | == RXWBFLAG_UDPON) && jme_udpsum(skb)) { |
891 | if (flags & RXWBFLAG_IPV4) | 1000 | if (flags & RXWBFLAG_IPV4) |
892 | netif_err(jme, rx_err, jme->dev, "UDP Checksum error\n"); | 1001 | netif_err(jme, rx_err, jme->dev, "UDP Checksum error\n"); |
893 | return false; | 1002 | return false; |
@@ -935,7 +1044,7 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx) | |||
935 | skb_put(skb, framesize); | 1044 | skb_put(skb, framesize); |
936 | skb->protocol = eth_type_trans(skb, jme->dev); | 1045 | skb->protocol = eth_type_trans(skb, jme->dev); |
937 | 1046 | ||
938 | if (jme_rxsum_ok(jme, le16_to_cpu(rxdesc->descwb.flags))) | 1047 | if (jme_rxsum_ok(jme, le16_to_cpu(rxdesc->descwb.flags), skb)) |
939 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1048 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
940 | else | 1049 | else |
941 | skb_checksum_none_assert(skb); | 1050 | skb_checksum_none_assert(skb); |
@@ -1207,7 +1316,6 @@ jme_link_change_tasklet(unsigned long arg) | |||
1207 | tasklet_disable(&jme->rxempty_task); | 1316 | tasklet_disable(&jme->rxempty_task); |
1208 | 1317 | ||
1209 | if (netif_carrier_ok(netdev)) { | 1318 | if (netif_carrier_ok(netdev)) { |
1210 | jme_reset_ghc_speed(jme); | ||
1211 | jme_disable_rx_engine(jme); | 1319 | jme_disable_rx_engine(jme); |
1212 | jme_disable_tx_engine(jme); | 1320 | jme_disable_tx_engine(jme); |
1213 | jme_reset_mac_processor(jme); | 1321 | jme_reset_mac_processor(jme); |
@@ -1577,6 +1685,38 @@ jme_free_irq(struct jme_adapter *jme) | |||
1577 | } | 1685 | } |
1578 | 1686 | ||
1579 | static inline void | 1687 | static inline void |
1688 | jme_new_phy_on(struct jme_adapter *jme) | ||
1689 | { | ||
1690 | u32 reg; | ||
1691 | |||
1692 | reg = jread32(jme, JME_PHY_PWR); | ||
1693 | reg &= ~(PHY_PWR_DWN1SEL | PHY_PWR_DWN1SW | | ||
1694 | PHY_PWR_DWN2 | PHY_PWR_CLKSEL); | ||
1695 | jwrite32(jme, JME_PHY_PWR, reg); | ||
1696 | |||
1697 | pci_read_config_dword(jme->pdev, PCI_PRIV_PE1, ®); | ||
1698 | reg &= ~PE1_GPREG0_PBG; | ||
1699 | reg |= PE1_GPREG0_ENBG; | ||
1700 | pci_write_config_dword(jme->pdev, PCI_PRIV_PE1, reg); | ||
1701 | } | ||
1702 | |||
1703 | static inline void | ||
1704 | jme_new_phy_off(struct jme_adapter *jme) | ||
1705 | { | ||
1706 | u32 reg; | ||
1707 | |||
1708 | reg = jread32(jme, JME_PHY_PWR); | ||
1709 | reg |= PHY_PWR_DWN1SEL | PHY_PWR_DWN1SW | | ||
1710 | PHY_PWR_DWN2 | PHY_PWR_CLKSEL; | ||
1711 | jwrite32(jme, JME_PHY_PWR, reg); | ||
1712 | |||
1713 | pci_read_config_dword(jme->pdev, PCI_PRIV_PE1, ®); | ||
1714 | reg &= ~PE1_GPREG0_PBG; | ||
1715 | reg |= PE1_GPREG0_PDD3COLD; | ||
1716 | pci_write_config_dword(jme->pdev, PCI_PRIV_PE1, reg); | ||
1717 | } | ||
1718 | |||
1719 | static inline void | ||
1580 | jme_phy_on(struct jme_adapter *jme) | 1720 | jme_phy_on(struct jme_adapter *jme) |
1581 | { | 1721 | { |
1582 | u32 bmcr; | 1722 | u32 bmcr; |
@@ -1584,6 +1724,22 @@ jme_phy_on(struct jme_adapter *jme) | |||
1584 | bmcr = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_BMCR); | 1724 | bmcr = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_BMCR); |
1585 | bmcr &= ~BMCR_PDOWN; | 1725 | bmcr &= ~BMCR_PDOWN; |
1586 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_BMCR, bmcr); | 1726 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_BMCR, bmcr); |
1727 | |||
1728 | if (new_phy_power_ctrl(jme->chip_main_rev)) | ||
1729 | jme_new_phy_on(jme); | ||
1730 | } | ||
1731 | |||
1732 | static inline void | ||
1733 | jme_phy_off(struct jme_adapter *jme) | ||
1734 | { | ||
1735 | u32 bmcr; | ||
1736 | |||
1737 | bmcr = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_BMCR); | ||
1738 | bmcr |= BMCR_PDOWN; | ||
1739 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_BMCR, bmcr); | ||
1740 | |||
1741 | if (new_phy_power_ctrl(jme->chip_main_rev)) | ||
1742 | jme_new_phy_off(jme); | ||
1587 | } | 1743 | } |
1588 | 1744 | ||
1589 | static int | 1745 | static int |
@@ -1606,12 +1762,11 @@ jme_open(struct net_device *netdev) | |||
1606 | 1762 | ||
1607 | jme_start_irq(jme); | 1763 | jme_start_irq(jme); |
1608 | 1764 | ||
1609 | if (test_bit(JME_FLAG_SSET, &jme->flags)) { | 1765 | jme_phy_on(jme); |
1610 | jme_phy_on(jme); | 1766 | if (test_bit(JME_FLAG_SSET, &jme->flags)) |
1611 | jme_set_settings(netdev, &jme->old_ecmd); | 1767 | jme_set_settings(netdev, &jme->old_ecmd); |
1612 | } else { | 1768 | else |
1613 | jme_reset_phy_processor(jme); | 1769 | jme_reset_phy_processor(jme); |
1614 | } | ||
1615 | 1770 | ||
1616 | jme_reset_link(jme); | 1771 | jme_reset_link(jme); |
1617 | 1772 | ||
@@ -1657,12 +1812,6 @@ jme_wait_link(struct jme_adapter *jme) | |||
1657 | } | 1812 | } |
1658 | } | 1813 | } |
1659 | 1814 | ||
1660 | static inline void | ||
1661 | jme_phy_off(struct jme_adapter *jme) | ||
1662 | { | ||
1663 | jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_BMCR, BMCR_PDOWN); | ||
1664 | } | ||
1665 | |||
1666 | static void | 1815 | static void |
1667 | jme_powersave_phy(struct jme_adapter *jme) | 1816 | jme_powersave_phy(struct jme_adapter *jme) |
1668 | { | 1817 | { |
@@ -1696,7 +1845,6 @@ jme_close(struct net_device *netdev) | |||
1696 | tasklet_disable(&jme->rxclean_task); | 1845 | tasklet_disable(&jme->rxclean_task); |
1697 | tasklet_disable(&jme->rxempty_task); | 1846 | tasklet_disable(&jme->rxempty_task); |
1698 | 1847 | ||
1699 | jme_reset_ghc_speed(jme); | ||
1700 | jme_disable_rx_engine(jme); | 1848 | jme_disable_rx_engine(jme); |
1701 | jme_disable_tx_engine(jme); | 1849 | jme_disable_tx_engine(jme); |
1702 | jme_reset_mac_processor(jme); | 1850 | jme_reset_mac_processor(jme); |
@@ -1993,27 +2141,34 @@ jme_start_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
1993 | return NETDEV_TX_OK; | 2141 | return NETDEV_TX_OK; |
1994 | } | 2142 | } |
1995 | 2143 | ||
2144 | static void | ||
2145 | jme_set_unicastaddr(struct net_device *netdev) | ||
2146 | { | ||
2147 | struct jme_adapter *jme = netdev_priv(netdev); | ||
2148 | u32 val; | ||
2149 | |||
2150 | val = (netdev->dev_addr[3] & 0xff) << 24 | | ||
2151 | (netdev->dev_addr[2] & 0xff) << 16 | | ||
2152 | (netdev->dev_addr[1] & 0xff) << 8 | | ||
2153 | (netdev->dev_addr[0] & 0xff); | ||
2154 | jwrite32(jme, JME_RXUMA_LO, val); | ||
2155 | val = (netdev->dev_addr[5] & 0xff) << 8 | | ||
2156 | (netdev->dev_addr[4] & 0xff); | ||
2157 | jwrite32(jme, JME_RXUMA_HI, val); | ||
2158 | } | ||
2159 | |||
1996 | static int | 2160 | static int |
1997 | jme_set_macaddr(struct net_device *netdev, void *p) | 2161 | jme_set_macaddr(struct net_device *netdev, void *p) |
1998 | { | 2162 | { |
1999 | struct jme_adapter *jme = netdev_priv(netdev); | 2163 | struct jme_adapter *jme = netdev_priv(netdev); |
2000 | struct sockaddr *addr = p; | 2164 | struct sockaddr *addr = p; |
2001 | u32 val; | ||
2002 | 2165 | ||
2003 | if (netif_running(netdev)) | 2166 | if (netif_running(netdev)) |
2004 | return -EBUSY; | 2167 | return -EBUSY; |
2005 | 2168 | ||
2006 | spin_lock_bh(&jme->macaddr_lock); | 2169 | spin_lock_bh(&jme->macaddr_lock); |
2007 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | 2170 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); |
2008 | 2171 | jme_set_unicastaddr(netdev); | |
2009 | val = (addr->sa_data[3] & 0xff) << 24 | | ||
2010 | (addr->sa_data[2] & 0xff) << 16 | | ||
2011 | (addr->sa_data[1] & 0xff) << 8 | | ||
2012 | (addr->sa_data[0] & 0xff); | ||
2013 | jwrite32(jme, JME_RXUMA_LO, val); | ||
2014 | val = (addr->sa_data[5] & 0xff) << 8 | | ||
2015 | (addr->sa_data[4] & 0xff); | ||
2016 | jwrite32(jme, JME_RXUMA_HI, val); | ||
2017 | spin_unlock_bh(&jme->macaddr_lock); | 2172 | spin_unlock_bh(&jme->macaddr_lock); |
2018 | 2173 | ||
2019 | return 0; | 2174 | return 0; |
@@ -2731,6 +2886,8 @@ jme_check_hw_ver(struct jme_adapter *jme) | |||
2731 | 2886 | ||
2732 | jme->fpgaver = (chipmode & CM_FPGAVER_MASK) >> CM_FPGAVER_SHIFT; | 2887 | jme->fpgaver = (chipmode & CM_FPGAVER_MASK) >> CM_FPGAVER_SHIFT; |
2733 | jme->chiprev = (chipmode & CM_CHIPREV_MASK) >> CM_CHIPREV_SHIFT; | 2888 | jme->chiprev = (chipmode & CM_CHIPREV_MASK) >> CM_CHIPREV_SHIFT; |
2889 | jme->chip_main_rev = jme->chiprev & 0xF; | ||
2890 | jme->chip_sub_rev = (jme->chiprev >> 4) & 0xF; | ||
2734 | } | 2891 | } |
2735 | 2892 | ||
2736 | static const struct net_device_ops jme_netdev_ops = { | 2893 | static const struct net_device_ops jme_netdev_ops = { |
@@ -2880,6 +3037,7 @@ jme_init_one(struct pci_dev *pdev, | |||
2880 | jme->reg_rxmcs = RXMCS_DEFAULT; | 3037 | jme->reg_rxmcs = RXMCS_DEFAULT; |
2881 | jme->reg_txpfc = 0; | 3038 | jme->reg_txpfc = 0; |
2882 | jme->reg_pmcs = PMCS_MFEN; | 3039 | jme->reg_pmcs = PMCS_MFEN; |
3040 | jme->reg_gpreg1 = GPREG1_DEFAULT; | ||
2883 | set_bit(JME_FLAG_TXCSUM, &jme->flags); | 3041 | set_bit(JME_FLAG_TXCSUM, &jme->flags); |
2884 | set_bit(JME_FLAG_TSO, &jme->flags); | 3042 | set_bit(JME_FLAG_TSO, &jme->flags); |
2885 | 3043 | ||
@@ -2936,8 +3094,8 @@ jme_init_one(struct pci_dev *pdev, | |||
2936 | jme->mii_if.mdio_write = jme_mdio_write; | 3094 | jme->mii_if.mdio_write = jme_mdio_write; |
2937 | 3095 | ||
2938 | jme_clear_pm(jme); | 3096 | jme_clear_pm(jme); |
2939 | jme_set_phyfifoa(jme); | 3097 | jme_set_phyfifo_5level(jme); |
2940 | pci_read_config_byte(pdev, PCI_REVISION_ID, &jme->rev); | 3098 | pci_read_config_byte(pdev, PCI_REVISION_ID, &jme->pcirev); |
2941 | if (!jme->fpgaver) | 3099 | if (!jme->fpgaver) |
2942 | jme_phy_init(jme); | 3100 | jme_phy_init(jme); |
2943 | jme_phy_off(jme); | 3101 | jme_phy_off(jme); |
@@ -2964,14 +3122,14 @@ jme_init_one(struct pci_dev *pdev, | |||
2964 | goto err_out_unmap; | 3122 | goto err_out_unmap; |
2965 | } | 3123 | } |
2966 | 3124 | ||
2967 | netif_info(jme, probe, jme->dev, "%s%s ver:%x rev:%x macaddr:%pM\n", | 3125 | netif_info(jme, probe, jme->dev, "%s%s chiprev:%x pcirev:%x macaddr:%pM\n", |
2968 | (jme->pdev->device == PCI_DEVICE_ID_JMICRON_JMC250) ? | 3126 | (jme->pdev->device == PCI_DEVICE_ID_JMICRON_JMC250) ? |
2969 | "JMC250 Gigabit Ethernet" : | 3127 | "JMC250 Gigabit Ethernet" : |
2970 | (jme->pdev->device == PCI_DEVICE_ID_JMICRON_JMC260) ? | 3128 | (jme->pdev->device == PCI_DEVICE_ID_JMICRON_JMC260) ? |
2971 | "JMC260 Fast Ethernet" : "Unknown", | 3129 | "JMC260 Fast Ethernet" : "Unknown", |
2972 | (jme->fpgaver != 0) ? " (FPGA)" : "", | 3130 | (jme->fpgaver != 0) ? " (FPGA)" : "", |
2973 | (jme->fpgaver != 0) ? jme->fpgaver : jme->chiprev, | 3131 | (jme->fpgaver != 0) ? jme->fpgaver : jme->chiprev, |
2974 | jme->rev, netdev->dev_addr); | 3132 | jme->pcirev, netdev->dev_addr); |
2975 | 3133 | ||
2976 | return 0; | 3134 | return 0; |
2977 | 3135 | ||
@@ -3035,7 +3193,6 @@ jme_suspend(struct pci_dev *pdev, pm_message_t state) | |||
3035 | jme_polling_mode(jme); | 3193 | jme_polling_mode(jme); |
3036 | 3194 | ||
3037 | jme_stop_pcc_timer(jme); | 3195 | jme_stop_pcc_timer(jme); |
3038 | jme_reset_ghc_speed(jme); | ||
3039 | jme_disable_rx_engine(jme); | 3196 | jme_disable_rx_engine(jme); |
3040 | jme_disable_tx_engine(jme); | 3197 | jme_disable_tx_engine(jme); |
3041 | jme_reset_mac_processor(jme); | 3198 | jme_reset_mac_processor(jme); |
@@ -3066,12 +3223,11 @@ jme_resume(struct pci_dev *pdev) | |||
3066 | jme_clear_pm(jme); | 3223 | jme_clear_pm(jme); |
3067 | pci_restore_state(pdev); | 3224 | pci_restore_state(pdev); |
3068 | 3225 | ||
3069 | if (test_bit(JME_FLAG_SSET, &jme->flags)) { | 3226 | jme_phy_on(jme); |
3070 | jme_phy_on(jme); | 3227 | if (test_bit(JME_FLAG_SSET, &jme->flags)) |
3071 | jme_set_settings(netdev, &jme->old_ecmd); | 3228 | jme_set_settings(netdev, &jme->old_ecmd); |
3072 | } else { | 3229 | else |
3073 | jme_reset_phy_processor(jme); | 3230 | jme_reset_phy_processor(jme); |
3074 | } | ||
3075 | 3231 | ||
3076 | jme_start_irq(jme); | 3232 | jme_start_irq(jme); |
3077 | netif_device_attach(netdev); | 3233 | netif_device_attach(netdev); |