0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/device.h>
0010 #include <linux/errno.h>
0011 #include <linux/etherdevice.h>
0012 #include <linux/ethtool.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/kernel.h>
0015 #include <linux/module.h>
0016 #include <linux/netdevice.h>
0017 #include <linux/regmap.h>
0018 #include <linux/skbuff.h>
0019 #include <linux/spi/spi.h>
0020
0021 #include "encx24j600_hw.h"
0022
0023 #define DRV_NAME "encx24j600"
0024 #define DRV_VERSION "1.0"
0025
0026 #define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
0027 static int debug = -1;
0028 module_param(debug, int, 0000);
0029 MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
0030
0031
0032
0033
0034
0035
0036 #define ENC_TX_BUF_START 0x0000U
0037 #define ENC_RX_BUF_START 0x0600U
0038 #define ENC_RX_BUF_END 0x5fffU
0039 #define ENC_SRAM_SIZE 0x6000U
0040
0041 enum {
0042 RXFILTER_NORMAL,
0043 RXFILTER_MULTI,
0044 RXFILTER_PROMISC
0045 };
0046
0047 struct encx24j600_priv {
0048 struct net_device *ndev;
0049 struct mutex lock;
0050 struct encx24j600_context ctx;
0051 struct sk_buff *tx_skb;
0052 struct task_struct *kworker_task;
0053 struct kthread_worker kworker;
0054 struct kthread_work tx_work;
0055 struct kthread_work setrx_work;
0056 u16 next_packet;
0057 bool hw_enabled;
0058 bool full_duplex;
0059 bool autoneg;
0060 u16 speed;
0061 int rxfilter;
0062 u32 msg_enable;
0063 };
0064
0065 static void dump_packet(const char *msg, int len, const char *data)
0066 {
0067 pr_debug(DRV_NAME ": %s - packet len:%d\n", msg, len);
0068 print_hex_dump_bytes("pk data: ", DUMP_PREFIX_OFFSET, data, len);
0069 }
0070
0071 static void encx24j600_dump_rsv(struct encx24j600_priv *priv, const char *msg,
0072 struct rsv *rsv)
0073 {
0074 struct net_device *dev = priv->ndev;
0075
0076 netdev_info(dev, "RX packet Len:%d\n", rsv->len);
0077 netdev_dbg(dev, "%s - NextPk: 0x%04x\n", msg,
0078 rsv->next_packet);
0079 netdev_dbg(dev, "RxOK: %d, DribbleNibble: %d\n",
0080 RSV_GETBIT(rsv->rxstat, RSV_RXOK),
0081 RSV_GETBIT(rsv->rxstat, RSV_DRIBBLENIBBLE));
0082 netdev_dbg(dev, "CRCErr:%d, LenChkErr: %d, LenOutOfRange: %d\n",
0083 RSV_GETBIT(rsv->rxstat, RSV_CRCERROR),
0084 RSV_GETBIT(rsv->rxstat, RSV_LENCHECKERR),
0085 RSV_GETBIT(rsv->rxstat, RSV_LENOUTOFRANGE));
0086 netdev_dbg(dev, "Multicast: %d, Broadcast: %d, LongDropEvent: %d, CarrierEvent: %d\n",
0087 RSV_GETBIT(rsv->rxstat, RSV_RXMULTICAST),
0088 RSV_GETBIT(rsv->rxstat, RSV_RXBROADCAST),
0089 RSV_GETBIT(rsv->rxstat, RSV_RXLONGEVDROPEV),
0090 RSV_GETBIT(rsv->rxstat, RSV_CARRIEREV));
0091 netdev_dbg(dev, "ControlFrame: %d, PauseFrame: %d, UnknownOp: %d, VLanTagFrame: %d\n",
0092 RSV_GETBIT(rsv->rxstat, RSV_RXCONTROLFRAME),
0093 RSV_GETBIT(rsv->rxstat, RSV_RXPAUSEFRAME),
0094 RSV_GETBIT(rsv->rxstat, RSV_RXUNKNOWNOPCODE),
0095 RSV_GETBIT(rsv->rxstat, RSV_RXTYPEVLAN));
0096 }
0097
0098 static u16 encx24j600_read_reg(struct encx24j600_priv *priv, u8 reg)
0099 {
0100 struct net_device *dev = priv->ndev;
0101 unsigned int val = 0;
0102 int ret = regmap_read(priv->ctx.regmap, reg, &val);
0103
0104 if (unlikely(ret))
0105 netif_err(priv, drv, dev, "%s: error %d reading reg %02x\n",
0106 __func__, ret, reg);
0107 return val;
0108 }
0109
0110 static void encx24j600_write_reg(struct encx24j600_priv *priv, u8 reg, u16 val)
0111 {
0112 struct net_device *dev = priv->ndev;
0113 int ret = regmap_write(priv->ctx.regmap, reg, val);
0114
0115 if (unlikely(ret))
0116 netif_err(priv, drv, dev, "%s: error %d writing reg %02x=%04x\n",
0117 __func__, ret, reg, val);
0118 }
0119
0120 static void encx24j600_update_reg(struct encx24j600_priv *priv, u8 reg,
0121 u16 mask, u16 val)
0122 {
0123 struct net_device *dev = priv->ndev;
0124 int ret = regmap_update_bits(priv->ctx.regmap, reg, mask, val);
0125
0126 if (unlikely(ret))
0127 netif_err(priv, drv, dev, "%s: error %d updating reg %02x=%04x~%04x\n",
0128 __func__, ret, reg, val, mask);
0129 }
0130
0131 static u16 encx24j600_read_phy(struct encx24j600_priv *priv, u8 reg)
0132 {
0133 struct net_device *dev = priv->ndev;
0134 unsigned int val = 0;
0135 int ret = regmap_read(priv->ctx.phymap, reg, &val);
0136
0137 if (unlikely(ret))
0138 netif_err(priv, drv, dev, "%s: error %d reading %02x\n",
0139 __func__, ret, reg);
0140 return val;
0141 }
0142
0143 static void encx24j600_write_phy(struct encx24j600_priv *priv, u8 reg, u16 val)
0144 {
0145 struct net_device *dev = priv->ndev;
0146 int ret = regmap_write(priv->ctx.phymap, reg, val);
0147
0148 if (unlikely(ret))
0149 netif_err(priv, drv, dev, "%s: error %d writing reg %02x=%04x\n",
0150 __func__, ret, reg, val);
0151 }
0152
0153 static void encx24j600_clr_bits(struct encx24j600_priv *priv, u8 reg, u16 mask)
0154 {
0155 encx24j600_update_reg(priv, reg, mask, 0);
0156 }
0157
0158 static void encx24j600_set_bits(struct encx24j600_priv *priv, u8 reg, u16 mask)
0159 {
0160 encx24j600_update_reg(priv, reg, mask, mask);
0161 }
0162
0163 static void encx24j600_cmd(struct encx24j600_priv *priv, u8 cmd)
0164 {
0165 struct net_device *dev = priv->ndev;
0166 int ret = regmap_write(priv->ctx.regmap, cmd, 0);
0167
0168 if (unlikely(ret))
0169 netif_err(priv, drv, dev, "%s: error %d with cmd %02x\n",
0170 __func__, ret, cmd);
0171 }
0172
0173 static int encx24j600_raw_read(struct encx24j600_priv *priv, u8 reg, u8 *data,
0174 size_t count)
0175 {
0176 int ret;
0177
0178 mutex_lock(&priv->ctx.mutex);
0179 ret = regmap_encx24j600_spi_read(&priv->ctx, reg, data, count);
0180 mutex_unlock(&priv->ctx.mutex);
0181
0182 return ret;
0183 }
0184
0185 static int encx24j600_raw_write(struct encx24j600_priv *priv, u8 reg,
0186 const u8 *data, size_t count)
0187 {
0188 int ret;
0189
0190 mutex_lock(&priv->ctx.mutex);
0191 ret = regmap_encx24j600_spi_write(&priv->ctx, reg, data, count);
0192 mutex_unlock(&priv->ctx.mutex);
0193
0194 return ret;
0195 }
0196
0197 static void encx24j600_update_phcon1(struct encx24j600_priv *priv)
0198 {
0199 u16 phcon1 = encx24j600_read_phy(priv, PHCON1);
0200
0201 if (priv->autoneg == AUTONEG_ENABLE) {
0202 phcon1 |= ANEN | RENEG;
0203 } else {
0204 phcon1 &= ~ANEN;
0205 if (priv->speed == SPEED_100)
0206 phcon1 |= SPD100;
0207 else
0208 phcon1 &= ~SPD100;
0209
0210 if (priv->full_duplex)
0211 phcon1 |= PFULDPX;
0212 else
0213 phcon1 &= ~PFULDPX;
0214 }
0215 encx24j600_write_phy(priv, PHCON1, phcon1);
0216 }
0217
0218
0219 static int encx24j600_wait_for_autoneg(struct encx24j600_priv *priv)
0220 {
0221 struct net_device *dev = priv->ndev;
0222 unsigned long timeout = jiffies + msecs_to_jiffies(2000);
0223 u16 phstat1;
0224 u16 estat;
0225
0226 phstat1 = encx24j600_read_phy(priv, PHSTAT1);
0227 while ((phstat1 & ANDONE) == 0) {
0228 if (time_after(jiffies, timeout)) {
0229 u16 phstat3;
0230
0231 netif_notice(priv, drv, dev, "timeout waiting for autoneg done\n");
0232
0233 priv->autoneg = AUTONEG_DISABLE;
0234 phstat3 = encx24j600_read_phy(priv, PHSTAT3);
0235 priv->speed = (phstat3 & PHY3SPD100)
0236 ? SPEED_100 : SPEED_10;
0237 priv->full_duplex = (phstat3 & PHY3DPX) ? 1 : 0;
0238 encx24j600_update_phcon1(priv);
0239 netif_notice(priv, drv, dev, "Using parallel detection: %s/%s",
0240 priv->speed == SPEED_100 ? "100" : "10",
0241 priv->full_duplex ? "Full" : "Half");
0242
0243 return -ETIMEDOUT;
0244 }
0245 cpu_relax();
0246 phstat1 = encx24j600_read_phy(priv, PHSTAT1);
0247 }
0248
0249 estat = encx24j600_read_reg(priv, ESTAT);
0250 if (estat & PHYDPX) {
0251 encx24j600_set_bits(priv, MACON2, FULDPX);
0252 encx24j600_write_reg(priv, MABBIPG, 0x15);
0253 } else {
0254 encx24j600_clr_bits(priv, MACON2, FULDPX);
0255 encx24j600_write_reg(priv, MABBIPG, 0x12);
0256
0257 encx24j600_write_reg(priv, MACLCON, 0x370f);
0258 }
0259
0260 return 0;
0261 }
0262
0263
0264 static void encx24j600_check_link_status(struct encx24j600_priv *priv)
0265 {
0266 struct net_device *dev = priv->ndev;
0267 u16 estat;
0268
0269 estat = encx24j600_read_reg(priv, ESTAT);
0270
0271 if (estat & PHYLNK) {
0272 if (priv->autoneg == AUTONEG_ENABLE)
0273 encx24j600_wait_for_autoneg(priv);
0274
0275 netif_carrier_on(dev);
0276 netif_info(priv, ifup, dev, "link up\n");
0277 } else {
0278 netif_info(priv, ifdown, dev, "link down\n");
0279
0280
0281
0282
0283 priv->autoneg = AUTONEG_ENABLE;
0284 priv->full_duplex = true;
0285 priv->speed = SPEED_100;
0286 netif_carrier_off(dev);
0287 }
0288 }
0289
0290 static void encx24j600_int_link_handler(struct encx24j600_priv *priv)
0291 {
0292 struct net_device *dev = priv->ndev;
0293
0294 netif_dbg(priv, intr, dev, "%s", __func__);
0295 encx24j600_check_link_status(priv);
0296 encx24j600_clr_bits(priv, EIR, LINKIF);
0297 }
0298
0299 static void encx24j600_tx_complete(struct encx24j600_priv *priv, bool err)
0300 {
0301 struct net_device *dev = priv->ndev;
0302
0303 if (!priv->tx_skb) {
0304 BUG();
0305 return;
0306 }
0307
0308 mutex_lock(&priv->lock);
0309
0310 if (err)
0311 dev->stats.tx_errors++;
0312 else
0313 dev->stats.tx_packets++;
0314
0315 dev->stats.tx_bytes += priv->tx_skb->len;
0316
0317 encx24j600_clr_bits(priv, EIR, TXIF | TXABTIF);
0318
0319 netif_dbg(priv, tx_done, dev, "TX Done%s\n", err ? ": Err" : "");
0320
0321 dev_kfree_skb(priv->tx_skb);
0322 priv->tx_skb = NULL;
0323
0324 netif_wake_queue(dev);
0325
0326 mutex_unlock(&priv->lock);
0327 }
0328
0329 static int encx24j600_receive_packet(struct encx24j600_priv *priv,
0330 struct rsv *rsv)
0331 {
0332 struct net_device *dev = priv->ndev;
0333 struct sk_buff *skb = netdev_alloc_skb(dev, rsv->len + NET_IP_ALIGN);
0334
0335 if (!skb) {
0336 pr_err_ratelimited("RX: OOM: packet dropped\n");
0337 dev->stats.rx_dropped++;
0338 return -ENOMEM;
0339 }
0340 skb_reserve(skb, NET_IP_ALIGN);
0341 encx24j600_raw_read(priv, RRXDATA, skb_put(skb, rsv->len), rsv->len);
0342
0343 if (netif_msg_pktdata(priv))
0344 dump_packet("RX", skb->len, skb->data);
0345
0346 skb->dev = dev;
0347 skb->protocol = eth_type_trans(skb, dev);
0348 skb->ip_summed = CHECKSUM_COMPLETE;
0349
0350
0351 dev->stats.rx_packets++;
0352 dev->stats.rx_bytes += rsv->len;
0353
0354 netif_rx(skb);
0355
0356 return 0;
0357 }
0358
0359 static void encx24j600_rx_packets(struct encx24j600_priv *priv, u8 packet_count)
0360 {
0361 struct net_device *dev = priv->ndev;
0362
0363 while (packet_count--) {
0364 struct rsv rsv;
0365 u16 newrxtail;
0366
0367 encx24j600_write_reg(priv, ERXRDPT, priv->next_packet);
0368 encx24j600_raw_read(priv, RRXDATA, (u8 *)&rsv, sizeof(rsv));
0369
0370 if (netif_msg_rx_status(priv))
0371 encx24j600_dump_rsv(priv, __func__, &rsv);
0372
0373 if (!RSV_GETBIT(rsv.rxstat, RSV_RXOK) ||
0374 (rsv.len > MAX_FRAMELEN)) {
0375 netif_err(priv, rx_err, dev, "RX Error %04x\n",
0376 rsv.rxstat);
0377 dev->stats.rx_errors++;
0378
0379 if (RSV_GETBIT(rsv.rxstat, RSV_CRCERROR))
0380 dev->stats.rx_crc_errors++;
0381 if (RSV_GETBIT(rsv.rxstat, RSV_LENCHECKERR))
0382 dev->stats.rx_frame_errors++;
0383 if (rsv.len > MAX_FRAMELEN)
0384 dev->stats.rx_over_errors++;
0385 } else {
0386 encx24j600_receive_packet(priv, &rsv);
0387 }
0388
0389 priv->next_packet = rsv.next_packet;
0390
0391 newrxtail = priv->next_packet - 2;
0392 if (newrxtail == ENC_RX_BUF_START)
0393 newrxtail = SRAM_SIZE - 2;
0394
0395 encx24j600_cmd(priv, SETPKTDEC);
0396 encx24j600_write_reg(priv, ERXTAIL, newrxtail);
0397 }
0398 }
0399
0400 static irqreturn_t encx24j600_isr(int irq, void *dev_id)
0401 {
0402 struct encx24j600_priv *priv = dev_id;
0403 struct net_device *dev = priv->ndev;
0404 int eir;
0405
0406
0407 encx24j600_cmd(priv, CLREIE);
0408
0409 eir = encx24j600_read_reg(priv, EIR);
0410
0411 if (eir & LINKIF)
0412 encx24j600_int_link_handler(priv);
0413
0414 if (eir & TXIF)
0415 encx24j600_tx_complete(priv, false);
0416
0417 if (eir & TXABTIF)
0418 encx24j600_tx_complete(priv, true);
0419
0420 if (eir & RXABTIF) {
0421 if (eir & PCFULIF) {
0422
0423 netif_err(priv, rx_err, dev, "Packet counter full\n");
0424 }
0425 dev->stats.rx_dropped++;
0426 encx24j600_clr_bits(priv, EIR, RXABTIF);
0427 }
0428
0429 if (eir & PKTIF) {
0430 u8 packet_count;
0431
0432 mutex_lock(&priv->lock);
0433
0434 packet_count = encx24j600_read_reg(priv, ESTAT) & 0xff;
0435 while (packet_count) {
0436 encx24j600_rx_packets(priv, packet_count);
0437 packet_count = encx24j600_read_reg(priv, ESTAT) & 0xff;
0438 }
0439
0440 mutex_unlock(&priv->lock);
0441 }
0442
0443
0444 encx24j600_cmd(priv, SETEIE);
0445
0446 return IRQ_HANDLED;
0447 }
0448
0449 static int encx24j600_soft_reset(struct encx24j600_priv *priv)
0450 {
0451 int ret = 0;
0452 int timeout;
0453 u16 eudast;
0454
0455
0456 regcache_cache_bypass(priv->ctx.regmap, true);
0457 timeout = 10;
0458 do {
0459 encx24j600_write_reg(priv, EUDAST, EUDAST_TEST_VAL);
0460 eudast = encx24j600_read_reg(priv, EUDAST);
0461 usleep_range(25, 100);
0462 } while ((eudast != EUDAST_TEST_VAL) && --timeout);
0463 regcache_cache_bypass(priv->ctx.regmap, false);
0464
0465 if (timeout == 0) {
0466 ret = -ETIMEDOUT;
0467 goto err_out;
0468 }
0469
0470
0471 timeout = 10;
0472 while (!(encx24j600_read_reg(priv, ESTAT) & CLKRDY) && --timeout)
0473 usleep_range(25, 100);
0474
0475 if (timeout == 0) {
0476 ret = -ETIMEDOUT;
0477 goto err_out;
0478 }
0479
0480
0481 encx24j600_cmd(priv, SETETHRST);
0482 usleep_range(25, 100);
0483
0484
0485 if (encx24j600_read_reg(priv, EUDAST) != 0) {
0486 ret = -EINVAL;
0487 goto err_out;
0488 }
0489
0490
0491 usleep_range(256, 1000);
0492
0493 err_out:
0494 return ret;
0495 }
0496
0497 static int encx24j600_hw_reset(struct encx24j600_priv *priv)
0498 {
0499 int ret;
0500
0501 mutex_lock(&priv->lock);
0502 ret = encx24j600_soft_reset(priv);
0503 mutex_unlock(&priv->lock);
0504
0505 return ret;
0506 }
0507
0508 static void encx24j600_reset_hw_tx(struct encx24j600_priv *priv)
0509 {
0510 encx24j600_set_bits(priv, ECON2, TXRST);
0511 encx24j600_clr_bits(priv, ECON2, TXRST);
0512 }
0513
0514 static void encx24j600_hw_init_tx(struct encx24j600_priv *priv)
0515 {
0516
0517 encx24j600_reset_hw_tx(priv);
0518
0519
0520 encx24j600_clr_bits(priv, EIR, TXIF | TXABTIF);
0521
0522
0523 encx24j600_write_reg(priv, EGPWRPT, ENC_TX_BUF_START);
0524 }
0525
0526 static void encx24j600_hw_init_rx(struct encx24j600_priv *priv)
0527 {
0528 encx24j600_cmd(priv, DISABLERX);
0529
0530
0531 encx24j600_write_reg(priv, ERXST, ENC_RX_BUF_START);
0532
0533
0534 encx24j600_write_reg(priv, ERXRDPT, ENC_RX_BUF_START);
0535
0536 priv->next_packet = ENC_RX_BUF_START;
0537
0538
0539 encx24j600_write_reg(priv, ERXTAIL, ENC_SRAM_SIZE - 2);
0540
0541
0542 encx24j600_write_reg(priv, EUDAST, ENC_SRAM_SIZE);
0543 encx24j600_write_reg(priv, EUDAND, ENC_SRAM_SIZE + 1);
0544
0545
0546 encx24j600_write_reg(priv, MAMXFL, MAX_FRAMELEN);
0547 }
0548
0549 static void encx24j600_dump_config(struct encx24j600_priv *priv,
0550 const char *msg)
0551 {
0552 pr_info(DRV_NAME ": %s\n", msg);
0553
0554
0555 pr_info(DRV_NAME " ECON1: %04X\n", encx24j600_read_reg(priv, ECON1));
0556 pr_info(DRV_NAME " ECON2: %04X\n", encx24j600_read_reg(priv, ECON2));
0557 pr_info(DRV_NAME " ERXFCON: %04X\n", encx24j600_read_reg(priv,
0558 ERXFCON));
0559 pr_info(DRV_NAME " ESTAT: %04X\n", encx24j600_read_reg(priv, ESTAT));
0560 pr_info(DRV_NAME " EIR: %04X\n", encx24j600_read_reg(priv, EIR));
0561 pr_info(DRV_NAME " EIDLED: %04X\n", encx24j600_read_reg(priv, EIDLED));
0562
0563
0564 pr_info(DRV_NAME " MACON1: %04X\n", encx24j600_read_reg(priv, MACON1));
0565 pr_info(DRV_NAME " MACON2: %04X\n", encx24j600_read_reg(priv, MACON2));
0566 pr_info(DRV_NAME " MAIPG: %04X\n", encx24j600_read_reg(priv, MAIPG));
0567 pr_info(DRV_NAME " MACLCON: %04X\n", encx24j600_read_reg(priv,
0568 MACLCON));
0569 pr_info(DRV_NAME " MABBIPG: %04X\n", encx24j600_read_reg(priv,
0570 MABBIPG));
0571
0572
0573 pr_info(DRV_NAME " PHCON1: %04X\n", encx24j600_read_phy(priv, PHCON1));
0574 pr_info(DRV_NAME " PHCON2: %04X\n", encx24j600_read_phy(priv, PHCON2));
0575 pr_info(DRV_NAME " PHANA: %04X\n", encx24j600_read_phy(priv, PHANA));
0576 pr_info(DRV_NAME " PHANLPA: %04X\n", encx24j600_read_phy(priv,
0577 PHANLPA));
0578 pr_info(DRV_NAME " PHANE: %04X\n", encx24j600_read_phy(priv, PHANE));
0579 pr_info(DRV_NAME " PHSTAT1: %04X\n", encx24j600_read_phy(priv,
0580 PHSTAT1));
0581 pr_info(DRV_NAME " PHSTAT2: %04X\n", encx24j600_read_phy(priv,
0582 PHSTAT2));
0583 pr_info(DRV_NAME " PHSTAT3: %04X\n", encx24j600_read_phy(priv,
0584 PHSTAT3));
0585 }
0586
0587 static void encx24j600_set_rxfilter_mode(struct encx24j600_priv *priv)
0588 {
0589 switch (priv->rxfilter) {
0590 case RXFILTER_PROMISC:
0591 encx24j600_set_bits(priv, MACON1, PASSALL);
0592 encx24j600_write_reg(priv, ERXFCON, UCEN | MCEN | NOTMEEN);
0593 break;
0594 case RXFILTER_MULTI:
0595 encx24j600_clr_bits(priv, MACON1, PASSALL);
0596 encx24j600_write_reg(priv, ERXFCON, UCEN | CRCEN | BCEN | MCEN);
0597 break;
0598 case RXFILTER_NORMAL:
0599 default:
0600 encx24j600_clr_bits(priv, MACON1, PASSALL);
0601 encx24j600_write_reg(priv, ERXFCON, UCEN | CRCEN | BCEN);
0602 break;
0603 }
0604 }
0605
0606 static void encx24j600_hw_init(struct encx24j600_priv *priv)
0607 {
0608 u16 macon2;
0609
0610 priv->hw_enabled = false;
0611
0612
0613
0614
0615
0616 encx24j600_update_reg(priv, EIDLED, 0xff00, 0xcb00);
0617
0618
0619 encx24j600_write_reg(priv, MACON1, 0x9);
0620
0621
0622 encx24j600_write_reg(priv, MAIPG, 0x0c12);
0623
0624
0625 encx24j600_write_phy(priv, PHANA, PHANA_DEFAULT);
0626
0627 encx24j600_update_phcon1(priv);
0628 encx24j600_check_link_status(priv);
0629
0630 macon2 = MACON2_RSV1 | TXCRCEN | PADCFG0 | PADCFG2 | MACON2_DEFER;
0631 if ((priv->autoneg == AUTONEG_DISABLE) && priv->full_duplex)
0632 macon2 |= FULDPX;
0633
0634 encx24j600_set_bits(priv, MACON2, macon2);
0635
0636 priv->rxfilter = RXFILTER_NORMAL;
0637 encx24j600_set_rxfilter_mode(priv);
0638
0639
0640 encx24j600_write_reg(priv, MAMXFL, MAX_FRAMELEN);
0641
0642
0643 encx24j600_hw_init_tx(priv);
0644
0645
0646 encx24j600_hw_init_rx(priv);
0647
0648 if (netif_msg_hw(priv))
0649 encx24j600_dump_config(priv, "Hw is initialized");
0650 }
0651
0652 static void encx24j600_hw_enable(struct encx24j600_priv *priv)
0653 {
0654
0655 encx24j600_clr_bits(priv, EIR, (PCFULIF | RXABTIF | TXABTIF | TXIF |
0656 PKTIF | LINKIF));
0657
0658
0659 encx24j600_write_reg(priv, EIE, (PCFULIE | RXABTIE | TXABTIE | TXIE |
0660 PKTIE | LINKIE | INTIE));
0661
0662
0663 encx24j600_cmd(priv, ENABLERX);
0664
0665 priv->hw_enabled = true;
0666 }
0667
0668 static void encx24j600_hw_disable(struct encx24j600_priv *priv)
0669 {
0670
0671 encx24j600_write_reg(priv, EIE, 0);
0672
0673
0674 encx24j600_cmd(priv, DISABLERX);
0675
0676 priv->hw_enabled = false;
0677 }
0678
0679 static int encx24j600_setlink(struct net_device *dev, u8 autoneg, u16 speed,
0680 u8 duplex)
0681 {
0682 struct encx24j600_priv *priv = netdev_priv(dev);
0683 int ret = 0;
0684
0685 if (!priv->hw_enabled) {
0686
0687
0688
0689 if (speed == SPEED_10 || speed == SPEED_100) {
0690 priv->autoneg = (autoneg == AUTONEG_ENABLE);
0691 priv->full_duplex = (duplex == DUPLEX_FULL);
0692 priv->speed = (speed == SPEED_100);
0693 } else {
0694 netif_warn(priv, link, dev, "unsupported link speed setting\n");
0695
0696
0697 ret = -EOPNOTSUPP;
0698 }
0699 } else {
0700 netif_warn(priv, link, dev, "Warning: hw must be disabled to set link mode\n");
0701 ret = -EBUSY;
0702 }
0703 return ret;
0704 }
0705
0706 static void encx24j600_hw_get_macaddr(struct encx24j600_priv *priv,
0707 unsigned char *ethaddr)
0708 {
0709 unsigned short val;
0710
0711 val = encx24j600_read_reg(priv, MAADR1);
0712
0713 ethaddr[0] = val & 0x00ff;
0714 ethaddr[1] = (val & 0xff00) >> 8;
0715
0716 val = encx24j600_read_reg(priv, MAADR2);
0717
0718 ethaddr[2] = val & 0x00ffU;
0719 ethaddr[3] = (val & 0xff00U) >> 8;
0720
0721 val = encx24j600_read_reg(priv, MAADR3);
0722
0723 ethaddr[4] = val & 0x00ffU;
0724 ethaddr[5] = (val & 0xff00U) >> 8;
0725 }
0726
0727
0728 static int encx24j600_set_hw_macaddr(struct net_device *dev)
0729 {
0730 struct encx24j600_priv *priv = netdev_priv(dev);
0731
0732 if (priv->hw_enabled) {
0733 netif_info(priv, drv, dev, "Hardware must be disabled to set Mac address\n");
0734 return -EBUSY;
0735 }
0736
0737 mutex_lock(&priv->lock);
0738
0739 netif_info(priv, drv, dev, "%s: Setting MAC address to %pM\n",
0740 dev->name, dev->dev_addr);
0741
0742 encx24j600_write_reg(priv, MAADR3, (dev->dev_addr[4] |
0743 dev->dev_addr[5] << 8));
0744 encx24j600_write_reg(priv, MAADR2, (dev->dev_addr[2] |
0745 dev->dev_addr[3] << 8));
0746 encx24j600_write_reg(priv, MAADR1, (dev->dev_addr[0] |
0747 dev->dev_addr[1] << 8));
0748
0749 mutex_unlock(&priv->lock);
0750
0751 return 0;
0752 }
0753
0754
0755 static int encx24j600_set_mac_address(struct net_device *dev, void *addr)
0756 {
0757 struct sockaddr *address = addr;
0758
0759 if (netif_running(dev))
0760 return -EBUSY;
0761 if (!is_valid_ether_addr(address->sa_data))
0762 return -EADDRNOTAVAIL;
0763
0764 eth_hw_addr_set(dev, address->sa_data);
0765 return encx24j600_set_hw_macaddr(dev);
0766 }
0767
0768 static int encx24j600_open(struct net_device *dev)
0769 {
0770 struct encx24j600_priv *priv = netdev_priv(dev);
0771
0772 int ret = request_threaded_irq(priv->ctx.spi->irq, NULL, encx24j600_isr,
0773 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
0774 DRV_NAME, priv);
0775 if (unlikely(ret < 0)) {
0776 netdev_err(dev, "request irq %d failed (ret = %d)\n",
0777 priv->ctx.spi->irq, ret);
0778 return ret;
0779 }
0780
0781 encx24j600_hw_disable(priv);
0782 encx24j600_hw_init(priv);
0783 encx24j600_hw_enable(priv);
0784 netif_start_queue(dev);
0785
0786 return 0;
0787 }
0788
0789 static int encx24j600_stop(struct net_device *dev)
0790 {
0791 struct encx24j600_priv *priv = netdev_priv(dev);
0792
0793 netif_stop_queue(dev);
0794 free_irq(priv->ctx.spi->irq, priv);
0795 return 0;
0796 }
0797
0798 static void encx24j600_setrx_proc(struct kthread_work *ws)
0799 {
0800 struct encx24j600_priv *priv =
0801 container_of(ws, struct encx24j600_priv, setrx_work);
0802
0803 mutex_lock(&priv->lock);
0804 encx24j600_set_rxfilter_mode(priv);
0805 mutex_unlock(&priv->lock);
0806 }
0807
0808 static void encx24j600_set_multicast_list(struct net_device *dev)
0809 {
0810 struct encx24j600_priv *priv = netdev_priv(dev);
0811 int oldfilter = priv->rxfilter;
0812
0813 if (dev->flags & IFF_PROMISC) {
0814 netif_dbg(priv, link, dev, "promiscuous mode\n");
0815 priv->rxfilter = RXFILTER_PROMISC;
0816 } else if ((dev->flags & IFF_ALLMULTI) || !netdev_mc_empty(dev)) {
0817 netif_dbg(priv, link, dev, "%smulticast mode\n",
0818 (dev->flags & IFF_ALLMULTI) ? "all-" : "");
0819 priv->rxfilter = RXFILTER_MULTI;
0820 } else {
0821 netif_dbg(priv, link, dev, "normal mode\n");
0822 priv->rxfilter = RXFILTER_NORMAL;
0823 }
0824
0825 if (oldfilter != priv->rxfilter)
0826 kthread_queue_work(&priv->kworker, &priv->setrx_work);
0827 }
0828
0829 static void encx24j600_hw_tx(struct encx24j600_priv *priv)
0830 {
0831 struct net_device *dev = priv->ndev;
0832
0833 netif_info(priv, tx_queued, dev, "TX Packet Len:%d\n",
0834 priv->tx_skb->len);
0835
0836 if (netif_msg_pktdata(priv))
0837 dump_packet("TX", priv->tx_skb->len, priv->tx_skb->data);
0838
0839 if (encx24j600_read_reg(priv, EIR) & TXABTIF)
0840
0841 encx24j600_reset_hw_tx(priv);
0842
0843
0844 encx24j600_clr_bits(priv, EIR, TXIF);
0845
0846
0847 encx24j600_write_reg(priv, EGPWRPT, ENC_TX_BUF_START);
0848
0849
0850 encx24j600_raw_write(priv, WGPDATA, (u8 *)priv->tx_skb->data,
0851 priv->tx_skb->len);
0852
0853
0854 encx24j600_write_reg(priv, ETXST, ENC_TX_BUF_START);
0855
0856
0857 encx24j600_write_reg(priv, ETXLEN, priv->tx_skb->len);
0858
0859
0860 encx24j600_cmd(priv, SETTXRTS);
0861 }
0862
0863 static void encx24j600_tx_proc(struct kthread_work *ws)
0864 {
0865 struct encx24j600_priv *priv =
0866 container_of(ws, struct encx24j600_priv, tx_work);
0867
0868 mutex_lock(&priv->lock);
0869 encx24j600_hw_tx(priv);
0870 mutex_unlock(&priv->lock);
0871 }
0872
0873 static netdev_tx_t encx24j600_tx(struct sk_buff *skb, struct net_device *dev)
0874 {
0875 struct encx24j600_priv *priv = netdev_priv(dev);
0876
0877 netif_stop_queue(dev);
0878
0879
0880 netif_trans_update(dev);
0881
0882
0883 priv->tx_skb = skb;
0884
0885 kthread_queue_work(&priv->kworker, &priv->tx_work);
0886
0887 return NETDEV_TX_OK;
0888 }
0889
0890
0891 static void encx24j600_tx_timeout(struct net_device *dev, unsigned int txqueue)
0892 {
0893 struct encx24j600_priv *priv = netdev_priv(dev);
0894
0895 netif_err(priv, tx_err, dev, "TX timeout at %ld, latency %ld\n",
0896 jiffies, jiffies - dev_trans_start(dev));
0897
0898 dev->stats.tx_errors++;
0899 netif_wake_queue(dev);
0900 }
0901
0902 static int encx24j600_get_regs_len(struct net_device *dev)
0903 {
0904 return SFR_REG_COUNT;
0905 }
0906
0907 static void encx24j600_get_regs(struct net_device *dev,
0908 struct ethtool_regs *regs, void *p)
0909 {
0910 struct encx24j600_priv *priv = netdev_priv(dev);
0911 u16 *buff = p;
0912 u8 reg;
0913
0914 regs->version = 1;
0915 mutex_lock(&priv->lock);
0916 for (reg = 0; reg < SFR_REG_COUNT; reg += 2) {
0917 unsigned int val = 0;
0918
0919 regmap_read(priv->ctx.regmap, reg, &val);
0920 buff[reg] = val & 0xffff;
0921 }
0922 mutex_unlock(&priv->lock);
0923 }
0924
0925 static void encx24j600_get_drvinfo(struct net_device *dev,
0926 struct ethtool_drvinfo *info)
0927 {
0928 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
0929 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
0930 strlcpy(info->bus_info, dev_name(dev->dev.parent),
0931 sizeof(info->bus_info));
0932 }
0933
0934 static int encx24j600_get_link_ksettings(struct net_device *dev,
0935 struct ethtool_link_ksettings *cmd)
0936 {
0937 struct encx24j600_priv *priv = netdev_priv(dev);
0938 u32 supported;
0939
0940 supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
0941 SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
0942 SUPPORTED_Autoneg | SUPPORTED_TP;
0943
0944 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
0945 supported);
0946
0947 cmd->base.speed = priv->speed;
0948 cmd->base.duplex = priv->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
0949 cmd->base.port = PORT_TP;
0950 cmd->base.autoneg = priv->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
0951
0952 return 0;
0953 }
0954
0955 static int
0956 encx24j600_set_link_ksettings(struct net_device *dev,
0957 const struct ethtool_link_ksettings *cmd)
0958 {
0959 return encx24j600_setlink(dev, cmd->base.autoneg,
0960 cmd->base.speed, cmd->base.duplex);
0961 }
0962
0963 static u32 encx24j600_get_msglevel(struct net_device *dev)
0964 {
0965 struct encx24j600_priv *priv = netdev_priv(dev);
0966
0967 return priv->msg_enable;
0968 }
0969
0970 static void encx24j600_set_msglevel(struct net_device *dev, u32 val)
0971 {
0972 struct encx24j600_priv *priv = netdev_priv(dev);
0973
0974 priv->msg_enable = val;
0975 }
0976
0977 static const struct ethtool_ops encx24j600_ethtool_ops = {
0978 .get_drvinfo = encx24j600_get_drvinfo,
0979 .get_msglevel = encx24j600_get_msglevel,
0980 .set_msglevel = encx24j600_set_msglevel,
0981 .get_regs_len = encx24j600_get_regs_len,
0982 .get_regs = encx24j600_get_regs,
0983 .get_link_ksettings = encx24j600_get_link_ksettings,
0984 .set_link_ksettings = encx24j600_set_link_ksettings,
0985 };
0986
0987 static const struct net_device_ops encx24j600_netdev_ops = {
0988 .ndo_open = encx24j600_open,
0989 .ndo_stop = encx24j600_stop,
0990 .ndo_start_xmit = encx24j600_tx,
0991 .ndo_set_rx_mode = encx24j600_set_multicast_list,
0992 .ndo_set_mac_address = encx24j600_set_mac_address,
0993 .ndo_tx_timeout = encx24j600_tx_timeout,
0994 .ndo_validate_addr = eth_validate_addr,
0995 };
0996
0997 static int encx24j600_spi_probe(struct spi_device *spi)
0998 {
0999 int ret;
1000
1001 struct net_device *ndev;
1002 struct encx24j600_priv *priv;
1003 u16 eidled;
1004 u8 addr[ETH_ALEN];
1005
1006 ndev = alloc_etherdev(sizeof(struct encx24j600_priv));
1007
1008 if (!ndev) {
1009 ret = -ENOMEM;
1010 goto error_out;
1011 }
1012
1013 priv = netdev_priv(ndev);
1014 spi_set_drvdata(spi, priv);
1015 dev_set_drvdata(&spi->dev, priv);
1016 SET_NETDEV_DEV(ndev, &spi->dev);
1017
1018 priv->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
1019 priv->ndev = ndev;
1020
1021
1022 priv->full_duplex = true;
1023 priv->autoneg = AUTONEG_ENABLE;
1024 priv->speed = SPEED_100;
1025
1026 priv->ctx.spi = spi;
1027 ndev->irq = spi->irq;
1028 ndev->netdev_ops = &encx24j600_netdev_ops;
1029
1030 ret = devm_regmap_init_encx24j600(&spi->dev, &priv->ctx);
1031 if (ret)
1032 goto out_free;
1033
1034 mutex_init(&priv->lock);
1035
1036
1037 if (encx24j600_hw_reset(priv)) {
1038 netif_err(priv, probe, ndev,
1039 DRV_NAME ": Chip is not detected\n");
1040 ret = -EIO;
1041 goto out_free;
1042 }
1043
1044
1045 encx24j600_hw_init(priv);
1046
1047 kthread_init_worker(&priv->kworker);
1048 kthread_init_work(&priv->tx_work, encx24j600_tx_proc);
1049 kthread_init_work(&priv->setrx_work, encx24j600_setrx_proc);
1050
1051 priv->kworker_task = kthread_run(kthread_worker_fn, &priv->kworker,
1052 "encx24j600");
1053
1054 if (IS_ERR(priv->kworker_task)) {
1055 ret = PTR_ERR(priv->kworker_task);
1056 goto out_free;
1057 }
1058
1059
1060 encx24j600_hw_get_macaddr(priv, addr);
1061 eth_hw_addr_set(ndev, addr);
1062
1063 ndev->ethtool_ops = &encx24j600_ethtool_ops;
1064
1065 ret = register_netdev(ndev);
1066 if (unlikely(ret)) {
1067 netif_err(priv, probe, ndev, "Error %d initializing card encx24j600 card\n",
1068 ret);
1069 goto out_stop;
1070 }
1071
1072 eidled = encx24j600_read_reg(priv, EIDLED);
1073 if (((eidled & DEVID_MASK) >> DEVID_SHIFT) != ENCX24J600_DEV_ID) {
1074 ret = -EINVAL;
1075 goto out_unregister;
1076 }
1077
1078 netif_info(priv, probe, ndev, "Silicon rev ID: 0x%02x\n",
1079 (eidled & REVID_MASK) >> REVID_SHIFT);
1080
1081 netif_info(priv, drv, priv->ndev, "MAC address %pM\n", ndev->dev_addr);
1082
1083 return ret;
1084
1085 out_unregister:
1086 unregister_netdev(priv->ndev);
1087 out_stop:
1088 kthread_stop(priv->kworker_task);
1089 out_free:
1090 free_netdev(ndev);
1091
1092 error_out:
1093 return ret;
1094 }
1095
1096 static void encx24j600_spi_remove(struct spi_device *spi)
1097 {
1098 struct encx24j600_priv *priv = dev_get_drvdata(&spi->dev);
1099
1100 unregister_netdev(priv->ndev);
1101 kthread_stop(priv->kworker_task);
1102
1103 free_netdev(priv->ndev);
1104 }
1105
1106 static const struct spi_device_id encx24j600_spi_id_table[] = {
1107 { .name = "encx24j600" },
1108 { }
1109 };
1110 MODULE_DEVICE_TABLE(spi, encx24j600_spi_id_table);
1111
1112 static struct spi_driver encx24j600_spi_net_driver = {
1113 .driver = {
1114 .name = DRV_NAME,
1115 .owner = THIS_MODULE,
1116 .bus = &spi_bus_type,
1117 },
1118 .probe = encx24j600_spi_probe,
1119 .remove = encx24j600_spi_remove,
1120 .id_table = encx24j600_spi_id_table,
1121 };
1122
1123 module_spi_driver(encx24j600_spi_net_driver);
1124
1125 MODULE_DESCRIPTION(DRV_NAME " ethernet driver");
1126 MODULE_AUTHOR("Jon Ringle <jringle@gridpoint.com>");
1127 MODULE_LICENSE("GPL");