Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: Microchip encx24j600 driver

This ethernet driver supports the Micorchip enc424j600/626j600 Ethernet
controller over a SPI bus interface. This driver makes use of the regmap API to
optimize access to registers by caching registers where possible.

Datasheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/39935b.pdf

Signed-off-by: Jon Ringle <jringle@gridpoint.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jon Ringle and committed by
David S. Miller
d70e5326 494f8eb9

+2087
+9
drivers/net/ethernet/microchip/Kconfig
··· 33 33 Enable the verify after the buffer write useful for debugging purpose. 34 34 If unsure, say N. 35 35 36 + config ENCX24J600 37 + tristate "ENCX24J600 support" 38 + depends on SPI 39 + ---help--- 40 + Support for the Microchip ENC424J600 ethernet chip. 41 + 42 + To compile this driver as a module, choose M here. The module will be 43 + called enc424j600. 44 + 36 45 endif # NET_VENDOR_MICROCHIP
+1
drivers/net/ethernet/microchip/Makefile
··· 3 3 # 4 4 5 5 obj-$(CONFIG_ENC28J60) += enc28j60.o 6 + obj-$(CONFIG_ENCX24J600) += encx24j600.o encx24j600-regmap.o
+513
drivers/net/ethernet/microchip/encx24j600-regmap.c
··· 1 + /** 2 + * Register map access API - ENCX24J600 support 3 + * 4 + * Copyright 2015 Gridpoint 5 + * 6 + * Author: Jon Ringle <jringle@gridpoint.com> 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License version 2 as 10 + * published by the Free Software Foundation. 11 + */ 12 + 13 + #include <linux/delay.h> 14 + #include <linux/errno.h> 15 + #include <linux/init.h> 16 + #include <linux/module.h> 17 + #include <linux/netdevice.h> 18 + #include <linux/regmap.h> 19 + #include <linux/spi/spi.h> 20 + 21 + #include "encx24j600_hw.h" 22 + 23 + static inline bool is_bits_set(int value, int mask) 24 + { 25 + return (value & mask) == mask; 26 + } 27 + 28 + static int encx24j600_switch_bank(struct encx24j600_context *ctx, 29 + int bank) 30 + { 31 + int ret = 0; 32 + 33 + int bank_opcode = BANK_SELECT(bank); 34 + ret = spi_write(ctx->spi, &bank_opcode, 1); 35 + if (ret == 0) 36 + ctx->bank = bank; 37 + 38 + return ret; 39 + } 40 + 41 + static int encx24j600_cmdn(struct encx24j600_context *ctx, u8 opcode, 42 + const void *buf, size_t len) 43 + { 44 + struct spi_message m; 45 + struct spi_transfer t[2] = { { .tx_buf = &opcode, .len = 1, }, 46 + { .tx_buf = buf, .len = len }, }; 47 + spi_message_init(&m); 48 + spi_message_add_tail(&t[0], &m); 49 + spi_message_add_tail(&t[1], &m); 50 + 51 + return spi_sync(ctx->spi, &m); 52 + } 53 + 54 + static void regmap_lock_mutex(void *context) 55 + { 56 + struct encx24j600_context *ctx = context; 57 + mutex_lock(&ctx->mutex); 58 + } 59 + 60 + static void regmap_unlock_mutex(void *context) 61 + { 62 + struct encx24j600_context *ctx = context; 63 + mutex_unlock(&ctx->mutex); 64 + } 65 + 66 + static int regmap_encx24j600_sfr_read(void *context, u8 reg, u8 *val, 67 + size_t len) 68 + { 69 + struct encx24j600_context *ctx = context; 70 + u8 banked_reg = reg & ADDR_MASK; 71 + u8 bank = ((reg & BANK_MASK) >> BANK_SHIFT); 72 + u8 cmd = RCRU; 73 + int ret = 0; 74 + int i = 0; 75 + u8 tx_buf[2]; 76 + 77 + if (reg < 0x80) { 78 + cmd = RCRCODE | banked_reg; 79 + if ((banked_reg < 0x16) && (ctx->bank != bank)) 80 + ret = encx24j600_switch_bank(ctx, bank); 81 + if (unlikely(ret)) 82 + return ret; 83 + } else { 84 + /* Translate registers that are more effecient using 85 + * 3-byte SPI commands 86 + */ 87 + switch (reg) { 88 + case EGPRDPT: 89 + cmd = RGPRDPT; break; 90 + case EGPWRPT: 91 + cmd = RGPWRPT; break; 92 + case ERXRDPT: 93 + cmd = RRXRDPT; break; 94 + case ERXWRPT: 95 + cmd = RRXWRPT; break; 96 + case EUDARDPT: 97 + cmd = RUDARDPT; break; 98 + case EUDAWRPT: 99 + cmd = RUDAWRPT; break; 100 + case EGPDATA: 101 + case ERXDATA: 102 + case EUDADATA: 103 + default: 104 + return -EINVAL; 105 + } 106 + } 107 + 108 + tx_buf[i++] = cmd; 109 + if (cmd == RCRU) 110 + tx_buf[i++] = reg; 111 + 112 + ret = spi_write_then_read(ctx->spi, tx_buf, i, val, len); 113 + 114 + return ret; 115 + } 116 + 117 + static int regmap_encx24j600_sfr_update(struct encx24j600_context *ctx, 118 + u8 reg, u8 *val, size_t len, 119 + u8 unbanked_cmd, u8 banked_code) 120 + { 121 + u8 banked_reg = reg & ADDR_MASK; 122 + u8 bank = ((reg & BANK_MASK) >> BANK_SHIFT); 123 + u8 cmd = unbanked_cmd; 124 + struct spi_message m; 125 + struct spi_transfer t[3] = { { .tx_buf = &cmd, .len = sizeof(cmd), }, 126 + { .tx_buf = &reg, .len = sizeof(reg), }, 127 + { .tx_buf = val, .len = len }, }; 128 + 129 + if (reg < 0x80) { 130 + int ret = 0; 131 + cmd = banked_code | banked_reg; 132 + if ((banked_reg < 0x16) && (ctx->bank != bank)) 133 + ret = encx24j600_switch_bank(ctx, bank); 134 + if (unlikely(ret)) 135 + return ret; 136 + } else { 137 + /* Translate registers that are more effecient using 138 + * 3-byte SPI commands 139 + */ 140 + switch (reg) { 141 + case EGPRDPT: 142 + cmd = WGPRDPT; break; 143 + case EGPWRPT: 144 + cmd = WGPWRPT; break; 145 + case ERXRDPT: 146 + cmd = WRXRDPT; break; 147 + case ERXWRPT: 148 + cmd = WRXWRPT; break; 149 + case EUDARDPT: 150 + cmd = WUDARDPT; break; 151 + case EUDAWRPT: 152 + cmd = WUDAWRPT; break; 153 + case EGPDATA: 154 + case ERXDATA: 155 + case EUDADATA: 156 + default: 157 + return -EINVAL; 158 + } 159 + } 160 + 161 + spi_message_init(&m); 162 + spi_message_add_tail(&t[0], &m); 163 + 164 + if (cmd == unbanked_cmd) { 165 + t[1].tx_buf = &reg; 166 + spi_message_add_tail(&t[1], &m); 167 + } 168 + 169 + spi_message_add_tail(&t[2], &m); 170 + return spi_sync(ctx->spi, &m); 171 + } 172 + 173 + static int regmap_encx24j600_sfr_write(void *context, u8 reg, u8 *val, 174 + size_t len) 175 + { 176 + struct encx24j600_context *ctx = context; 177 + return regmap_encx24j600_sfr_update(ctx, reg, val, len, WCRU, WCRCODE); 178 + } 179 + 180 + static int regmap_encx24j600_sfr_set_bits(struct encx24j600_context *ctx, 181 + u8 reg, u8 val) 182 + { 183 + return regmap_encx24j600_sfr_update(ctx, reg, &val, 1, BFSU, BFSCODE); 184 + } 185 + 186 + static int regmap_encx24j600_sfr_clr_bits(struct encx24j600_context *ctx, 187 + u8 reg, u8 val) 188 + { 189 + return regmap_encx24j600_sfr_update(ctx, reg, &val, 1, BFCU, BFCCODE); 190 + } 191 + 192 + static int regmap_encx24j600_reg_update_bits(void *context, unsigned int reg, 193 + unsigned int mask, 194 + unsigned int val) 195 + { 196 + struct encx24j600_context *ctx = context; 197 + 198 + int ret = 0; 199 + unsigned int set_mask = mask & val; 200 + unsigned int clr_mask = mask & ~val; 201 + 202 + if ((reg >= 0x40 && reg < 0x6c) || reg >= 0x80) 203 + return -EINVAL; 204 + 205 + if (set_mask & 0xff) 206 + ret = regmap_encx24j600_sfr_set_bits(ctx, reg, set_mask); 207 + 208 + set_mask = (set_mask & 0xff00) >> 8; 209 + 210 + if ((set_mask & 0xff) && (ret == 0)) 211 + ret = regmap_encx24j600_sfr_set_bits(ctx, reg + 1, set_mask); 212 + 213 + if ((clr_mask & 0xff) && (ret == 0)) 214 + ret = regmap_encx24j600_sfr_clr_bits(ctx, reg, clr_mask); 215 + 216 + clr_mask = (clr_mask & 0xff00) >> 8; 217 + 218 + if ((clr_mask & 0xff) && (ret == 0)) 219 + ret = regmap_encx24j600_sfr_clr_bits(ctx, reg + 1, clr_mask); 220 + 221 + return ret; 222 + } 223 + 224 + int regmap_encx24j600_spi_write(void *context, u8 reg, const u8 *data, 225 + size_t count) 226 + { 227 + struct encx24j600_context *ctx = context; 228 + 229 + if (reg < 0xc0) 230 + return encx24j600_cmdn(ctx, reg, data, count); 231 + else 232 + /* SPI 1-byte command. Ignore data */ 233 + return spi_write(ctx->spi, &reg, 1); 234 + } 235 + EXPORT_SYMBOL_GPL(regmap_encx24j600_spi_write); 236 + 237 + int regmap_encx24j600_spi_read(void *context, u8 reg, u8 *data, size_t count) 238 + { 239 + struct encx24j600_context *ctx = context; 240 + 241 + if (reg == RBSEL && count > 1) 242 + count = 1; 243 + 244 + return spi_write_then_read(ctx->spi, &reg, sizeof(reg), data, count); 245 + } 246 + EXPORT_SYMBOL_GPL(regmap_encx24j600_spi_read); 247 + 248 + static int regmap_encx24j600_write(void *context, const void *data, 249 + size_t len) 250 + { 251 + u8 *dout = (u8 *)data; 252 + u8 reg = dout[0]; 253 + ++dout; 254 + --len; 255 + 256 + if (reg > 0xa0) 257 + return regmap_encx24j600_spi_write(context, reg, dout, len); 258 + 259 + if (len > 2) 260 + return -EINVAL; 261 + 262 + return regmap_encx24j600_sfr_write(context, reg, dout, len); 263 + } 264 + 265 + static int regmap_encx24j600_read(void *context, 266 + const void *reg_buf, size_t reg_size, 267 + void *val, size_t val_size) 268 + { 269 + u8 reg = *(const u8 *)reg_buf; 270 + 271 + if (reg_size != 1) { 272 + pr_err("%s: reg=%02x reg_size=%zu\n", __func__, reg, reg_size); 273 + return -EINVAL; 274 + } 275 + 276 + if (reg > 0xa0) 277 + return regmap_encx24j600_spi_read(context, reg, val, val_size); 278 + 279 + if (val_size > 2) { 280 + pr_err("%s: reg=%02x val_size=%zu\n", __func__, reg, val_size); 281 + return -EINVAL; 282 + } 283 + 284 + return regmap_encx24j600_sfr_read(context, reg, val, val_size); 285 + } 286 + 287 + static bool encx24j600_regmap_readable(struct device *dev, unsigned int reg) 288 + { 289 + if ((reg < 0x36) || 290 + ((reg >= 0x40) && (reg < 0x4c)) || 291 + ((reg >= 0x52) && (reg < 0x56)) || 292 + ((reg >= 0x60) && (reg < 0x66)) || 293 + ((reg >= 0x68) && (reg < 0x80)) || 294 + ((reg >= 0x86) && (reg < 0x92)) || 295 + (reg == 0xc8)) 296 + return true; 297 + else 298 + return false; 299 + } 300 + 301 + static bool encx24j600_regmap_writeable(struct device *dev, unsigned int reg) 302 + { 303 + if ((reg < 0x12) || 304 + ((reg >= 0x14) && (reg < 0x1a)) || 305 + ((reg >= 0x1c) && (reg < 0x36)) || 306 + ((reg >= 0x40) && (reg < 0x4c)) || 307 + ((reg >= 0x52) && (reg < 0x56)) || 308 + ((reg >= 0x60) && (reg < 0x68)) || 309 + ((reg >= 0x6c) && (reg < 0x80)) || 310 + ((reg >= 0x86) && (reg < 0x92)) || 311 + ((reg >= 0xc0) && (reg < 0xc8)) || 312 + ((reg >= 0xca) && (reg < 0xf0))) 313 + return true; 314 + else 315 + return false; 316 + } 317 + 318 + static bool encx24j600_regmap_volatile(struct device *dev, unsigned int reg) 319 + { 320 + switch (reg) { 321 + case ERXHEAD: 322 + case EDMACS: 323 + case ETXSTAT: 324 + case ETXWIRE: 325 + case ECON1: /* Can be modified via single byte cmds */ 326 + case ECON2: /* Can be modified via single byte cmds */ 327 + case ESTAT: 328 + case EIR: /* Can be modified via single byte cmds */ 329 + case MIRD: 330 + case MISTAT: 331 + return true; 332 + default: 333 + break; 334 + } 335 + 336 + return false; 337 + } 338 + 339 + static bool encx24j600_regmap_precious(struct device *dev, unsigned int reg) 340 + { 341 + /* single byte cmds are precious */ 342 + if (((reg >= 0xc0) && (reg < 0xc8)) || 343 + ((reg >= 0xca) && (reg < 0xf0))) 344 + return true; 345 + else 346 + return false; 347 + } 348 + 349 + static int regmap_encx24j600_phy_reg_read(void *context, unsigned int reg, 350 + unsigned int *val) 351 + { 352 + struct encx24j600_context *ctx = context; 353 + int ret; 354 + unsigned int mistat; 355 + 356 + reg = MIREGADR_VAL | (reg & PHREG_MASK); 357 + ret = regmap_write(ctx->regmap, MIREGADR, reg); 358 + if (unlikely(ret)) 359 + goto err_out; 360 + 361 + ret = regmap_write(ctx->regmap, MICMD, MIIRD); 362 + if (unlikely(ret)) 363 + goto err_out; 364 + 365 + usleep_range(26, 100); 366 + while ((ret = regmap_read(ctx->regmap, MISTAT, &mistat) != 0) && 367 + (mistat & BUSY)) 368 + cpu_relax(); 369 + 370 + if (unlikely(ret)) 371 + goto err_out; 372 + 373 + ret = regmap_write(ctx->regmap, MICMD, 0); 374 + if (unlikely(ret)) 375 + goto err_out; 376 + 377 + ret = regmap_read(ctx->regmap, MIRD, val); 378 + 379 + err_out: 380 + if (ret) 381 + pr_err("%s: error %d reading reg %02x\n", __func__, ret, 382 + reg & PHREG_MASK); 383 + 384 + return ret; 385 + } 386 + 387 + static int regmap_encx24j600_phy_reg_write(void *context, unsigned int reg, 388 + unsigned int val) 389 + { 390 + struct encx24j600_context *ctx = context; 391 + int ret; 392 + unsigned int mistat; 393 + 394 + reg = MIREGADR_VAL | (reg & PHREG_MASK); 395 + ret = regmap_write(ctx->regmap, MIREGADR, reg); 396 + if (unlikely(ret)) 397 + goto err_out; 398 + 399 + ret = regmap_write(ctx->regmap, MIWR, val); 400 + if (unlikely(ret)) 401 + goto err_out; 402 + 403 + usleep_range(26, 100); 404 + while ((ret = regmap_read(ctx->regmap, MISTAT, &mistat) != 0) && 405 + (mistat & BUSY)) 406 + cpu_relax(); 407 + 408 + err_out: 409 + if (ret) 410 + pr_err("%s: error %d writing reg %02x=%04x\n", __func__, ret, 411 + reg & PHREG_MASK, val); 412 + 413 + return ret; 414 + } 415 + 416 + static bool encx24j600_phymap_readable(struct device *dev, unsigned int reg) 417 + { 418 + switch (reg) { 419 + case PHCON1: 420 + case PHSTAT1: 421 + case PHANA: 422 + case PHANLPA: 423 + case PHANE: 424 + case PHCON2: 425 + case PHSTAT2: 426 + case PHSTAT3: 427 + return true; 428 + default: 429 + return false; 430 + } 431 + } 432 + 433 + static bool encx24j600_phymap_writeable(struct device *dev, unsigned int reg) 434 + { 435 + switch (reg) { 436 + case PHCON1: 437 + case PHCON2: 438 + case PHANA: 439 + return true; 440 + case PHSTAT1: 441 + case PHSTAT2: 442 + case PHSTAT3: 443 + case PHANLPA: 444 + case PHANE: 445 + default: 446 + return false; 447 + } 448 + } 449 + 450 + static bool encx24j600_phymap_volatile(struct device *dev, unsigned int reg) 451 + { 452 + switch (reg) { 453 + case PHSTAT1: 454 + case PHSTAT2: 455 + case PHSTAT3: 456 + case PHANLPA: 457 + case PHANE: 458 + case PHCON2: 459 + return true; 460 + default: 461 + return false; 462 + } 463 + } 464 + 465 + static struct regmap_config regcfg = { 466 + .name = "reg", 467 + .reg_bits = 8, 468 + .val_bits = 16, 469 + .max_register = 0xee, 470 + .reg_stride = 2, 471 + .cache_type = REGCACHE_RBTREE, 472 + .val_format_endian = REGMAP_ENDIAN_LITTLE, 473 + .readable_reg = encx24j600_regmap_readable, 474 + .writeable_reg = encx24j600_regmap_writeable, 475 + .volatile_reg = encx24j600_regmap_volatile, 476 + .precious_reg = encx24j600_regmap_precious, 477 + .lock = regmap_lock_mutex, 478 + .unlock = regmap_unlock_mutex, 479 + }; 480 + 481 + static struct regmap_bus regmap_encx24j600 = { 482 + .write = regmap_encx24j600_write, 483 + .read = regmap_encx24j600_read, 484 + .reg_update_bits = regmap_encx24j600_reg_update_bits, 485 + }; 486 + 487 + static struct regmap_config phycfg = { 488 + .name = "phy", 489 + .reg_bits = 8, 490 + .val_bits = 16, 491 + .max_register = 0x1f, 492 + .cache_type = REGCACHE_RBTREE, 493 + .val_format_endian = REGMAP_ENDIAN_LITTLE, 494 + .readable_reg = encx24j600_phymap_readable, 495 + .writeable_reg = encx24j600_phymap_writeable, 496 + .volatile_reg = encx24j600_phymap_volatile, 497 + }; 498 + static struct regmap_bus phymap_encx24j600 = { 499 + .reg_write = regmap_encx24j600_phy_reg_write, 500 + .reg_read = regmap_encx24j600_phy_reg_read, 501 + }; 502 + 503 + void devm_regmap_init_encx24j600(struct device *dev, 504 + struct encx24j600_context *ctx) 505 + { 506 + mutex_init(&ctx->mutex); 507 + regcfg.lock_arg = ctx; 508 + ctx->regmap = devm_regmap_init(dev, &regmap_encx24j600, ctx, &regcfg); 509 + ctx->phymap = devm_regmap_init(dev, &phymap_encx24j600, ctx, &phycfg); 510 + } 511 + EXPORT_SYMBOL_GPL(devm_regmap_init_encx24j600); 512 + 513 + MODULE_LICENSE("GPL");
+1127
drivers/net/ethernet/microchip/encx24j600.c
··· 1 + /** 2 + * Microchip ENCX24J600 ethernet driver 3 + * 4 + * Copyright (C) 2015 Gridpoint 5 + * Author: Jon Ringle <jringle@gridpoint.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + * 12 + */ 13 + 14 + #include <linux/device.h> 15 + #include <linux/errno.h> 16 + #include <linux/etherdevice.h> 17 + #include <linux/ethtool.h> 18 + #include <linux/interrupt.h> 19 + #include <linux/kernel.h> 20 + #include <linux/module.h> 21 + #include <linux/netdevice.h> 22 + #include <linux/regmap.h> 23 + #include <linux/skbuff.h> 24 + #include <linux/spi/spi.h> 25 + 26 + #include "encx24j600_hw.h" 27 + 28 + #define DRV_NAME "encx24j600" 29 + #define DRV_VERSION "1.0" 30 + 31 + #define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK) 32 + static int debug = -1; 33 + module_param(debug, int, 0); 34 + MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); 35 + 36 + /* SRAM memory layout: 37 + * 38 + * 0x0000-0x05ff TX buffers 1.5KB (1*1536) reside in the GP area in SRAM 39 + * 0x0600-0x5fff RX buffers 22.5KB (15*1536) reside in the RX area in SRAM 40 + */ 41 + #define ENC_TX_BUF_START 0x0000U 42 + #define ENC_RX_BUF_START 0x0600U 43 + #define ENC_RX_BUF_END 0x5fffU 44 + #define ENC_SRAM_SIZE 0x6000U 45 + 46 + enum { 47 + RXFILTER_NORMAL, 48 + RXFILTER_MULTI, 49 + RXFILTER_PROMISC 50 + }; 51 + 52 + struct encx24j600_priv { 53 + struct net_device *ndev; 54 + struct mutex lock; /* device access lock */ 55 + struct encx24j600_context ctx; 56 + struct sk_buff *tx_skb; 57 + struct task_struct *kworker_task; 58 + struct kthread_worker kworker; 59 + struct kthread_work tx_work; 60 + struct kthread_work setrx_work; 61 + u16 next_packet; 62 + bool hw_enabled; 63 + bool full_duplex; 64 + bool autoneg; 65 + u16 speed; 66 + int rxfilter; 67 + u32 msg_enable; 68 + }; 69 + 70 + static void dump_packet(const char *msg, int len, const char *data) 71 + { 72 + pr_debug(DRV_NAME ": %s - packet len:%d\n", msg, len); 73 + print_hex_dump_bytes("pk data: ", DUMP_PREFIX_OFFSET, data, len); 74 + } 75 + 76 + static void encx24j600_dump_rsv(struct encx24j600_priv *priv, const char *msg, 77 + struct rsv *rsv) 78 + { 79 + struct net_device *dev = priv->ndev; 80 + 81 + netdev_info(dev, "RX packet Len:%d\n", rsv->len); 82 + netdev_dbg(dev, "%s - NextPk: 0x%04x\n", msg, 83 + rsv->next_packet); 84 + netdev_dbg(dev, "RxOK: %d, DribbleNibble: %d\n", 85 + RSV_GETBIT(rsv->rxstat, RSV_RXOK), 86 + RSV_GETBIT(rsv->rxstat, RSV_DRIBBLENIBBLE)); 87 + netdev_dbg(dev, "CRCErr:%d, LenChkErr: %d, LenOutOfRange: %d\n", 88 + RSV_GETBIT(rsv->rxstat, RSV_CRCERROR), 89 + RSV_GETBIT(rsv->rxstat, RSV_LENCHECKERR), 90 + RSV_GETBIT(rsv->rxstat, RSV_LENOUTOFRANGE)); 91 + netdev_dbg(dev, "Multicast: %d, Broadcast: %d, LongDropEvent: %d, CarrierEvent: %d\n", 92 + RSV_GETBIT(rsv->rxstat, RSV_RXMULTICAST), 93 + RSV_GETBIT(rsv->rxstat, RSV_RXBROADCAST), 94 + RSV_GETBIT(rsv->rxstat, RSV_RXLONGEVDROPEV), 95 + RSV_GETBIT(rsv->rxstat, RSV_CARRIEREV)); 96 + netdev_dbg(dev, "ControlFrame: %d, PauseFrame: %d, UnknownOp: %d, VLanTagFrame: %d\n", 97 + RSV_GETBIT(rsv->rxstat, RSV_RXCONTROLFRAME), 98 + RSV_GETBIT(rsv->rxstat, RSV_RXPAUSEFRAME), 99 + RSV_GETBIT(rsv->rxstat, RSV_RXUNKNOWNOPCODE), 100 + RSV_GETBIT(rsv->rxstat, RSV_RXTYPEVLAN)); 101 + } 102 + 103 + static u16 encx24j600_read_reg(struct encx24j600_priv *priv, u8 reg) 104 + { 105 + struct net_device *dev = priv->ndev; 106 + unsigned int val = 0; 107 + int ret = regmap_read(priv->ctx.regmap, reg, &val); 108 + if (unlikely(ret)) 109 + netif_err(priv, drv, dev, "%s: error %d reading reg %02x\n", 110 + __func__, ret, reg); 111 + return val; 112 + } 113 + 114 + static void encx24j600_write_reg(struct encx24j600_priv *priv, u8 reg, u16 val) 115 + { 116 + struct net_device *dev = priv->ndev; 117 + int ret = regmap_write(priv->ctx.regmap, reg, val); 118 + if (unlikely(ret)) 119 + netif_err(priv, drv, dev, "%s: error %d writing reg %02x=%04x\n", 120 + __func__, ret, reg, val); 121 + } 122 + 123 + static void encx24j600_update_reg(struct encx24j600_priv *priv, u8 reg, 124 + u16 mask, u16 val) 125 + { 126 + struct net_device *dev = priv->ndev; 127 + int ret = regmap_update_bits(priv->ctx.regmap, reg, mask, val); 128 + if (unlikely(ret)) 129 + netif_err(priv, drv, dev, "%s: error %d updating reg %02x=%04x~%04x\n", 130 + __func__, ret, reg, val, mask); 131 + } 132 + 133 + static u16 encx24j600_read_phy(struct encx24j600_priv *priv, u8 reg) 134 + { 135 + struct net_device *dev = priv->ndev; 136 + unsigned int val = 0; 137 + int ret = regmap_read(priv->ctx.phymap, reg, &val); 138 + if (unlikely(ret)) 139 + netif_err(priv, drv, dev, "%s: error %d reading %02x\n", 140 + __func__, ret, reg); 141 + return val; 142 + } 143 + 144 + static void encx24j600_write_phy(struct encx24j600_priv *priv, u8 reg, u16 val) 145 + { 146 + struct net_device *dev = priv->ndev; 147 + int ret = regmap_write(priv->ctx.phymap, reg, val); 148 + if (unlikely(ret)) 149 + netif_err(priv, drv, dev, "%s: error %d writing reg %02x=%04x\n", 150 + __func__, ret, reg, val); 151 + } 152 + 153 + static void encx24j600_clr_bits(struct encx24j600_priv *priv, u8 reg, u16 mask) 154 + { 155 + encx24j600_update_reg(priv, reg, mask, 0); 156 + } 157 + 158 + static void encx24j600_set_bits(struct encx24j600_priv *priv, u8 reg, u16 mask) 159 + { 160 + encx24j600_update_reg(priv, reg, mask, mask); 161 + } 162 + 163 + static void encx24j600_cmd(struct encx24j600_priv *priv, u8 cmd) 164 + { 165 + struct net_device *dev = priv->ndev; 166 + int ret = regmap_write(priv->ctx.regmap, cmd, 0); 167 + if (unlikely(ret)) 168 + netif_err(priv, drv, dev, "%s: error %d with cmd %02x\n", 169 + __func__, ret, cmd); 170 + } 171 + 172 + static int encx24j600_raw_read(struct encx24j600_priv *priv, u8 reg, u8 *data, 173 + size_t count) 174 + { 175 + int ret; 176 + mutex_lock(&priv->ctx.mutex); 177 + ret = regmap_encx24j600_spi_read(&priv->ctx, reg, data, count); 178 + mutex_unlock(&priv->ctx.mutex); 179 + 180 + return ret; 181 + } 182 + 183 + static int encx24j600_raw_write(struct encx24j600_priv *priv, u8 reg, 184 + const u8 *data, size_t count) 185 + { 186 + int ret; 187 + mutex_lock(&priv->ctx.mutex); 188 + ret = regmap_encx24j600_spi_write(&priv->ctx, reg, data, count); 189 + mutex_unlock(&priv->ctx.mutex); 190 + 191 + return ret; 192 + } 193 + 194 + static void encx24j600_update_phcon1(struct encx24j600_priv *priv) 195 + { 196 + u16 phcon1 = encx24j600_read_phy(priv, PHCON1); 197 + if (priv->autoneg == AUTONEG_ENABLE) { 198 + phcon1 |= ANEN | RENEG; 199 + } else { 200 + phcon1 &= ~ANEN; 201 + if (priv->speed == SPEED_100) 202 + phcon1 |= SPD100; 203 + else 204 + phcon1 &= ~SPD100; 205 + 206 + if (priv->full_duplex) 207 + phcon1 |= PFULDPX; 208 + else 209 + phcon1 &= ~PFULDPX; 210 + } 211 + encx24j600_write_phy(priv, PHCON1, phcon1); 212 + } 213 + 214 + /* Waits for autonegotiation to complete. */ 215 + static int encx24j600_wait_for_autoneg(struct encx24j600_priv *priv) 216 + { 217 + struct net_device *dev = priv->ndev; 218 + unsigned long timeout = jiffies + msecs_to_jiffies(2000); 219 + u16 phstat1; 220 + u16 estat; 221 + int ret = 0; 222 + 223 + phstat1 = encx24j600_read_phy(priv, PHSTAT1); 224 + while ((phstat1 & ANDONE) == 0) { 225 + if (time_after(jiffies, timeout)) { 226 + u16 phstat3; 227 + 228 + netif_notice(priv, drv, dev, "timeout waiting for autoneg done\n"); 229 + 230 + priv->autoneg = AUTONEG_DISABLE; 231 + phstat3 = encx24j600_read_phy(priv, PHSTAT3); 232 + priv->speed = (phstat3 & PHY3SPD100) 233 + ? SPEED_100 : SPEED_10; 234 + priv->full_duplex = (phstat3 & PHY3DPX) ? 1 : 0; 235 + encx24j600_update_phcon1(priv); 236 + netif_notice(priv, drv, dev, "Using parallel detection: %s/%s", 237 + priv->speed == SPEED_100 ? "100" : "10", 238 + priv->full_duplex ? "Full" : "Half"); 239 + 240 + return -ETIMEDOUT; 241 + } 242 + cpu_relax(); 243 + phstat1 = encx24j600_read_phy(priv, PHSTAT1); 244 + } 245 + 246 + estat = encx24j600_read_reg(priv, ESTAT); 247 + if (estat & PHYDPX) { 248 + encx24j600_set_bits(priv, MACON2, FULDPX); 249 + encx24j600_write_reg(priv, MABBIPG, 0x15); 250 + } else { 251 + encx24j600_clr_bits(priv, MACON2, FULDPX); 252 + encx24j600_write_reg(priv, MABBIPG, 0x12); 253 + /* Max retransmittions attempt */ 254 + encx24j600_write_reg(priv, MACLCON, 0x370f); 255 + } 256 + 257 + return ret; 258 + } 259 + 260 + /* Access the PHY to determine link status */ 261 + static void encx24j600_check_link_status(struct encx24j600_priv *priv) 262 + { 263 + struct net_device *dev = priv->ndev; 264 + u16 estat; 265 + 266 + estat = encx24j600_read_reg(priv, ESTAT); 267 + 268 + if (estat & PHYLNK) { 269 + if (priv->autoneg == AUTONEG_ENABLE) 270 + encx24j600_wait_for_autoneg(priv); 271 + 272 + netif_carrier_on(dev); 273 + netif_info(priv, ifup, dev, "link up\n"); 274 + } else { 275 + netif_info(priv, ifdown, dev, "link down\n"); 276 + 277 + /* Re-enable autoneg since we won't know what we might be 278 + * connected to when the link is brought back up again. 279 + */ 280 + priv->autoneg = AUTONEG_ENABLE; 281 + priv->full_duplex = true; 282 + priv->speed = SPEED_100; 283 + netif_carrier_off(dev); 284 + } 285 + } 286 + 287 + static void encx24j600_int_link_handler(struct encx24j600_priv *priv) 288 + { 289 + struct net_device *dev = priv->ndev; 290 + 291 + netif_dbg(priv, intr, dev, "%s", __func__); 292 + encx24j600_check_link_status(priv); 293 + encx24j600_clr_bits(priv, EIR, LINKIF); 294 + } 295 + 296 + static void encx24j600_tx_complete(struct encx24j600_priv *priv, bool err) 297 + { 298 + struct net_device *dev = priv->ndev; 299 + 300 + if (!priv->tx_skb) { 301 + BUG(); 302 + return; 303 + } 304 + 305 + mutex_lock(&priv->lock); 306 + 307 + if (err) 308 + dev->stats.tx_errors++; 309 + else 310 + dev->stats.tx_packets++; 311 + 312 + dev->stats.tx_bytes += priv->tx_skb->len; 313 + 314 + encx24j600_clr_bits(priv, EIR, TXIF | TXABTIF); 315 + 316 + netif_dbg(priv, tx_done, dev, "TX Done%s\n", err ? ": Err" : ""); 317 + 318 + dev_kfree_skb(priv->tx_skb); 319 + priv->tx_skb = NULL; 320 + 321 + netif_wake_queue(dev); 322 + 323 + mutex_unlock(&priv->lock); 324 + } 325 + 326 + static int encx24j600_receive_packet(struct encx24j600_priv *priv, 327 + struct rsv *rsv) 328 + { 329 + struct net_device *dev = priv->ndev; 330 + struct sk_buff *skb = netdev_alloc_skb(dev, rsv->len + NET_IP_ALIGN); 331 + if (!skb) { 332 + pr_err_ratelimited("RX: OOM: packet dropped\n"); 333 + dev->stats.rx_dropped++; 334 + return -ENOMEM; 335 + } 336 + skb_reserve(skb, NET_IP_ALIGN); 337 + encx24j600_raw_read(priv, RRXDATA, skb_put(skb, rsv->len), rsv->len); 338 + 339 + if (netif_msg_pktdata(priv)) 340 + dump_packet("RX", skb->len, skb->data); 341 + 342 + skb->dev = dev; 343 + skb->protocol = eth_type_trans(skb, dev); 344 + skb->ip_summed = CHECKSUM_COMPLETE; 345 + 346 + /* Maintain stats */ 347 + dev->stats.rx_packets++; 348 + dev->stats.rx_bytes += rsv->len; 349 + priv->next_packet = rsv->next_packet; 350 + 351 + netif_rx(skb); 352 + 353 + return 0; 354 + } 355 + 356 + static void encx24j600_rx_packets(struct encx24j600_priv *priv, u8 packet_count) 357 + { 358 + struct net_device *dev = priv->ndev; 359 + 360 + while (packet_count--) { 361 + struct rsv rsv; 362 + u16 newrxtail; 363 + 364 + encx24j600_write_reg(priv, ERXRDPT, priv->next_packet); 365 + encx24j600_raw_read(priv, RRXDATA, (u8 *)&rsv, sizeof(rsv)); 366 + 367 + if (netif_msg_rx_status(priv)) 368 + encx24j600_dump_rsv(priv, __func__, &rsv); 369 + 370 + if (!RSV_GETBIT(rsv.rxstat, RSV_RXOK) || 371 + (rsv.len > MAX_FRAMELEN)) { 372 + netif_err(priv, rx_err, dev, "RX Error %04x\n", 373 + rsv.rxstat); 374 + dev->stats.rx_errors++; 375 + 376 + if (RSV_GETBIT(rsv.rxstat, RSV_CRCERROR)) 377 + dev->stats.rx_crc_errors++; 378 + if (RSV_GETBIT(rsv.rxstat, RSV_LENCHECKERR)) 379 + dev->stats.rx_frame_errors++; 380 + if (rsv.len > MAX_FRAMELEN) 381 + dev->stats.rx_over_errors++; 382 + } else { 383 + encx24j600_receive_packet(priv, &rsv); 384 + } 385 + 386 + newrxtail = priv->next_packet - 2; 387 + if (newrxtail == ENC_RX_BUF_START) 388 + newrxtail = SRAM_SIZE - 2; 389 + 390 + encx24j600_cmd(priv, SETPKTDEC); 391 + encx24j600_write_reg(priv, ERXTAIL, newrxtail); 392 + } 393 + } 394 + 395 + static irqreturn_t encx24j600_isr(int irq, void *dev_id) 396 + { 397 + struct encx24j600_priv *priv = dev_id; 398 + struct net_device *dev = priv->ndev; 399 + int eir; 400 + 401 + /* Clear interrupts */ 402 + encx24j600_cmd(priv, CLREIE); 403 + 404 + eir = encx24j600_read_reg(priv, EIR); 405 + 406 + if (eir & LINKIF) 407 + encx24j600_int_link_handler(priv); 408 + 409 + if (eir & TXIF) 410 + encx24j600_tx_complete(priv, false); 411 + 412 + if (eir & TXABTIF) 413 + encx24j600_tx_complete(priv, true); 414 + 415 + if (eir & RXABTIF) { 416 + if (eir & PCFULIF) { 417 + /* Packet counter is full */ 418 + netif_err(priv, rx_err, dev, "Packet counter full\n"); 419 + } 420 + dev->stats.rx_dropped++; 421 + encx24j600_clr_bits(priv, EIR, RXABTIF); 422 + } 423 + 424 + if (eir & PKTIF) { 425 + u8 packet_count; 426 + 427 + mutex_lock(&priv->lock); 428 + 429 + packet_count = encx24j600_read_reg(priv, ESTAT) & 0xff; 430 + while (packet_count) { 431 + encx24j600_rx_packets(priv, packet_count); 432 + packet_count = encx24j600_read_reg(priv, ESTAT) & 0xff; 433 + } 434 + 435 + mutex_unlock(&priv->lock); 436 + } 437 + 438 + /* Enable interrupts */ 439 + encx24j600_cmd(priv, SETEIE); 440 + 441 + return IRQ_HANDLED; 442 + } 443 + 444 + static int encx24j600_soft_reset(struct encx24j600_priv *priv) 445 + { 446 + int ret = 0; 447 + int timeout; 448 + u16 eudast; 449 + 450 + /* Write and verify a test value to EUDAST */ 451 + regcache_cache_bypass(priv->ctx.regmap, true); 452 + timeout = 10; 453 + do { 454 + encx24j600_write_reg(priv, EUDAST, EUDAST_TEST_VAL); 455 + eudast = encx24j600_read_reg(priv, EUDAST); 456 + usleep_range(25, 100); 457 + } while ((eudast != EUDAST_TEST_VAL) && --timeout); 458 + regcache_cache_bypass(priv->ctx.regmap, false); 459 + 460 + if (timeout == 0) { 461 + ret = -ETIMEDOUT; 462 + goto err_out; 463 + } 464 + 465 + /* Wait for CLKRDY to become set */ 466 + timeout = 10; 467 + while (!(encx24j600_read_reg(priv, ESTAT) & CLKRDY) && --timeout) 468 + usleep_range(25, 100); 469 + 470 + if (timeout == 0) { 471 + ret = -ETIMEDOUT; 472 + goto err_out; 473 + } 474 + 475 + /* Issue a System Reset command */ 476 + encx24j600_cmd(priv, SETETHRST); 477 + usleep_range(25, 100); 478 + 479 + /* Confirm that EUDAST has 0000h after system reset */ 480 + if (encx24j600_read_reg(priv, EUDAST) != 0) { 481 + ret = -EINVAL; 482 + goto err_out; 483 + } 484 + 485 + /* Wait for PHY register and status bits to become available */ 486 + usleep_range(256, 1000); 487 + 488 + err_out: 489 + return ret; 490 + } 491 + 492 + static int encx24j600_hw_reset(struct encx24j600_priv *priv) 493 + { 494 + int ret; 495 + 496 + mutex_lock(&priv->lock); 497 + ret = encx24j600_soft_reset(priv); 498 + mutex_unlock(&priv->lock); 499 + 500 + return ret; 501 + } 502 + 503 + static void encx24j600_reset_hw_tx(struct encx24j600_priv *priv) 504 + { 505 + encx24j600_set_bits(priv, ECON2, TXRST); 506 + encx24j600_clr_bits(priv, ECON2, TXRST); 507 + } 508 + 509 + static void encx24j600_hw_init_tx(struct encx24j600_priv *priv) 510 + { 511 + /* Reset TX */ 512 + encx24j600_reset_hw_tx(priv); 513 + 514 + /* Clear the TXIF flag if were previously set */ 515 + encx24j600_clr_bits(priv, EIR, TXIF | TXABTIF); 516 + 517 + /* Write the Tx Buffer pointer */ 518 + encx24j600_write_reg(priv, EGPWRPT, ENC_TX_BUF_START); 519 + } 520 + 521 + static void encx24j600_hw_init_rx(struct encx24j600_priv *priv) 522 + { 523 + encx24j600_cmd(priv, DISABLERX); 524 + 525 + /* Set up RX packet start address in the SRAM */ 526 + encx24j600_write_reg(priv, ERXST, ENC_RX_BUF_START); 527 + 528 + /* Preload the RX Data pointer to the beginning of the RX area */ 529 + encx24j600_write_reg(priv, ERXRDPT, ENC_RX_BUF_START); 530 + 531 + priv->next_packet = ENC_RX_BUF_START; 532 + 533 + /* Set up RX end address in the SRAM */ 534 + encx24j600_write_reg(priv, ERXTAIL, ENC_SRAM_SIZE - 2); 535 + 536 + /* Reset the user data pointers */ 537 + encx24j600_write_reg(priv, EUDAST, ENC_SRAM_SIZE); 538 + encx24j600_write_reg(priv, EUDAND, ENC_SRAM_SIZE + 1); 539 + 540 + /* Set Max Frame length */ 541 + encx24j600_write_reg(priv, MAMXFL, MAX_FRAMELEN); 542 + } 543 + 544 + static void encx24j600_dump_config(struct encx24j600_priv *priv, 545 + const char *msg) 546 + { 547 + pr_info(DRV_NAME ": %s\n", msg); 548 + 549 + /* CHIP configuration */ 550 + pr_info(DRV_NAME " ECON1: %04X\n", encx24j600_read_reg(priv, ECON1)); 551 + pr_info(DRV_NAME " ECON2: %04X\n", encx24j600_read_reg(priv, ECON2)); 552 + pr_info(DRV_NAME " ERXFCON: %04X\n", encx24j600_read_reg(priv, 553 + ERXFCON)); 554 + pr_info(DRV_NAME " ESTAT: %04X\n", encx24j600_read_reg(priv, ESTAT)); 555 + pr_info(DRV_NAME " EIR: %04X\n", encx24j600_read_reg(priv, EIR)); 556 + pr_info(DRV_NAME " EIDLED: %04X\n", encx24j600_read_reg(priv, EIDLED)); 557 + 558 + /* MAC layer configuration */ 559 + pr_info(DRV_NAME " MACON1: %04X\n", encx24j600_read_reg(priv, MACON1)); 560 + pr_info(DRV_NAME " MACON2: %04X\n", encx24j600_read_reg(priv, MACON2)); 561 + pr_info(DRV_NAME " MAIPG: %04X\n", encx24j600_read_reg(priv, MAIPG)); 562 + pr_info(DRV_NAME " MACLCON: %04X\n", encx24j600_read_reg(priv, 563 + MACLCON)); 564 + pr_info(DRV_NAME " MABBIPG: %04X\n", encx24j600_read_reg(priv, 565 + MABBIPG)); 566 + 567 + /* PHY configuation */ 568 + pr_info(DRV_NAME " PHCON1: %04X\n", encx24j600_read_phy(priv, PHCON1)); 569 + pr_info(DRV_NAME " PHCON2: %04X\n", encx24j600_read_phy(priv, PHCON2)); 570 + pr_info(DRV_NAME " PHANA: %04X\n", encx24j600_read_phy(priv, PHANA)); 571 + pr_info(DRV_NAME " PHANLPA: %04X\n", encx24j600_read_phy(priv, 572 + PHANLPA)); 573 + pr_info(DRV_NAME " PHANE: %04X\n", encx24j600_read_phy(priv, PHANE)); 574 + pr_info(DRV_NAME " PHSTAT1: %04X\n", encx24j600_read_phy(priv, 575 + PHSTAT1)); 576 + pr_info(DRV_NAME " PHSTAT2: %04X\n", encx24j600_read_phy(priv, 577 + PHSTAT2)); 578 + pr_info(DRV_NAME " PHSTAT3: %04X\n", encx24j600_read_phy(priv, 579 + PHSTAT3)); 580 + } 581 + 582 + static void encx24j600_set_rxfilter_mode(struct encx24j600_priv *priv) 583 + { 584 + switch (priv->rxfilter) { 585 + case RXFILTER_PROMISC: 586 + encx24j600_set_bits(priv, MACON1, PASSALL); 587 + encx24j600_write_reg(priv, ERXFCON, UCEN | MCEN | NOTMEEN); 588 + break; 589 + case RXFILTER_MULTI: 590 + encx24j600_clr_bits(priv, MACON1, PASSALL); 591 + encx24j600_write_reg(priv, ERXFCON, UCEN | CRCEN | BCEN | MCEN); 592 + break; 593 + case RXFILTER_NORMAL: 594 + default: 595 + encx24j600_clr_bits(priv, MACON1, PASSALL); 596 + encx24j600_write_reg(priv, ERXFCON, UCEN | CRCEN | BCEN); 597 + break; 598 + } 599 + } 600 + 601 + static int encx24j600_hw_init(struct encx24j600_priv *priv) 602 + { 603 + struct net_device *dev = priv->ndev; 604 + int ret = 0; 605 + u16 eidled; 606 + u16 macon2; 607 + 608 + priv->hw_enabled = false; 609 + 610 + eidled = encx24j600_read_reg(priv, EIDLED); 611 + if (((eidled & DEVID_MASK) >> DEVID_SHIFT) != ENCX24J600_DEV_ID) { 612 + ret = -EINVAL; 613 + goto err_out; 614 + } 615 + 616 + netif_info(priv, drv, dev, "Silicon rev ID: 0x%02x\n", 617 + (eidled & REVID_MASK) >> REVID_SHIFT); 618 + 619 + /* PHY Leds: link status, 620 + * LEDA: Link + transmit/receive events 621 + * LEDB: Link State + colision events 622 + */ 623 + encx24j600_update_reg(priv, EIDLED, 0xbc00, 0xbc00); 624 + 625 + /* Loopback disabled */ 626 + encx24j600_write_reg(priv, MACON1, 0x9); 627 + 628 + /* interpacket gap value */ 629 + encx24j600_write_reg(priv, MAIPG, 0x0c12); 630 + 631 + /* Write the auto negotiation pattern */ 632 + encx24j600_write_phy(priv, PHANA, PHANA_DEFAULT); 633 + 634 + encx24j600_update_phcon1(priv); 635 + encx24j600_check_link_status(priv); 636 + 637 + macon2 = MACON2_RSV1 | TXCRCEN | PADCFG0 | PADCFG2 | MACON2_DEFER; 638 + if ((priv->autoneg == AUTONEG_DISABLE) && priv->full_duplex) 639 + macon2 |= FULDPX; 640 + 641 + encx24j600_set_bits(priv, MACON2, macon2); 642 + 643 + priv->rxfilter = RXFILTER_NORMAL; 644 + encx24j600_set_rxfilter_mode(priv); 645 + 646 + /* Program the Maximum frame length */ 647 + encx24j600_write_reg(priv, MAMXFL, MAX_FRAMELEN); 648 + 649 + /* Init Tx pointers */ 650 + encx24j600_hw_init_tx(priv); 651 + 652 + /* Init Rx pointers */ 653 + encx24j600_hw_init_rx(priv); 654 + 655 + if (netif_msg_hw(priv)) 656 + encx24j600_dump_config(priv, "Hw is initialized"); 657 + 658 + err_out: 659 + return ret; 660 + } 661 + 662 + static void encx24j600_hw_enable(struct encx24j600_priv *priv) 663 + { 664 + /* Clear the interrupt flags in case was set */ 665 + encx24j600_clr_bits(priv, EIR, (PCFULIF | RXABTIF | TXABTIF | TXIF | 666 + PKTIF | LINKIF)); 667 + 668 + /* Enable the interrupts */ 669 + encx24j600_write_reg(priv, EIE, (PCFULIE | RXABTIE | TXABTIE | TXIE | 670 + PKTIE | LINKIE | INTIE)); 671 + 672 + /* Enable RX */ 673 + encx24j600_cmd(priv, ENABLERX); 674 + 675 + priv->hw_enabled = true; 676 + } 677 + 678 + static void encx24j600_hw_disable(struct encx24j600_priv *priv) 679 + { 680 + /* Disable all interrupts */ 681 + encx24j600_write_reg(priv, EIE, 0); 682 + 683 + /* Disable RX */ 684 + encx24j600_cmd(priv, DISABLERX); 685 + 686 + priv->hw_enabled = false; 687 + } 688 + 689 + static int encx24j600_setlink(struct net_device *dev, u8 autoneg, u16 speed, 690 + u8 duplex) 691 + { 692 + struct encx24j600_priv *priv = netdev_priv(dev); 693 + int ret = 0; 694 + 695 + if (!priv->hw_enabled) { 696 + /* link is in low power mode now; duplex setting 697 + * will take effect on next encx24j600_hw_init() 698 + */ 699 + if (speed == SPEED_10 || speed == SPEED_100) { 700 + priv->autoneg = (autoneg == AUTONEG_ENABLE); 701 + priv->full_duplex = (duplex == DUPLEX_FULL); 702 + priv->speed = (speed == SPEED_100); 703 + } else { 704 + netif_warn(priv, link, dev, "unsupported link speed setting\n"); 705 + /*speeds other than SPEED_10 and SPEED_100 */ 706 + /*are not supported by chip */ 707 + ret = -EOPNOTSUPP; 708 + } 709 + } else { 710 + netif_warn(priv, link, dev, "Warning: hw must be disabled to set link mode\n"); 711 + ret = -EBUSY; 712 + } 713 + return ret; 714 + } 715 + 716 + static void encx24j600_hw_get_macaddr(struct encx24j600_priv *priv, 717 + unsigned char *ethaddr) 718 + { 719 + unsigned short val; 720 + 721 + val = encx24j600_read_reg(priv, MAADR1); 722 + 723 + ethaddr[0] = val & 0x00ff; 724 + ethaddr[1] = (val & 0xff00) >> 8; 725 + 726 + val = encx24j600_read_reg(priv, MAADR2); 727 + 728 + ethaddr[2] = val & 0x00ffU; 729 + ethaddr[3] = (val & 0xff00U) >> 8; 730 + 731 + val = encx24j600_read_reg(priv, MAADR3); 732 + 733 + ethaddr[4] = val & 0x00ffU; 734 + ethaddr[5] = (val & 0xff00U) >> 8; 735 + } 736 + 737 + /* Program the hardware MAC address from dev->dev_addr.*/ 738 + static int encx24j600_set_hw_macaddr(struct net_device *dev) 739 + { 740 + struct encx24j600_priv *priv = netdev_priv(dev); 741 + 742 + if (priv->hw_enabled) { 743 + netif_info(priv, drv, dev, "Hardware must be disabled to set Mac address\n"); 744 + return -EBUSY; 745 + } 746 + 747 + mutex_lock(&priv->lock); 748 + 749 + netif_info(priv, drv, dev, "%s: Setting MAC address to %pM\n", 750 + dev->name, dev->dev_addr); 751 + 752 + encx24j600_write_reg(priv, MAADR3, (dev->dev_addr[4] | 753 + dev->dev_addr[5] << 8)); 754 + encx24j600_write_reg(priv, MAADR2, (dev->dev_addr[2] | 755 + dev->dev_addr[3] << 8)); 756 + encx24j600_write_reg(priv, MAADR1, (dev->dev_addr[0] | 757 + dev->dev_addr[1] << 8)); 758 + 759 + mutex_unlock(&priv->lock); 760 + 761 + return 0; 762 + } 763 + 764 + /* Store the new hardware address in dev->dev_addr, and update the MAC.*/ 765 + static int encx24j600_set_mac_address(struct net_device *dev, void *addr) 766 + { 767 + struct sockaddr *address = addr; 768 + 769 + if (netif_running(dev)) 770 + return -EBUSY; 771 + if (!is_valid_ether_addr(address->sa_data)) 772 + return -EADDRNOTAVAIL; 773 + 774 + memcpy(dev->dev_addr, address->sa_data, dev->addr_len); 775 + return encx24j600_set_hw_macaddr(dev); 776 + } 777 + 778 + static int encx24j600_open(struct net_device *dev) 779 + { 780 + struct encx24j600_priv *priv = netdev_priv(dev); 781 + 782 + int ret = request_threaded_irq(priv->ctx.spi->irq, NULL, encx24j600_isr, 783 + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 784 + DRV_NAME, priv); 785 + if (unlikely(ret < 0)) { 786 + netdev_err(dev, "request irq %d failed (ret = %d)\n", 787 + priv->ctx.spi->irq, ret); 788 + return ret; 789 + } 790 + 791 + encx24j600_hw_disable(priv); 792 + encx24j600_hw_init(priv); 793 + encx24j600_hw_enable(priv); 794 + netif_start_queue(dev); 795 + 796 + return 0; 797 + } 798 + 799 + static int encx24j600_stop(struct net_device *dev) 800 + { 801 + struct encx24j600_priv *priv = netdev_priv(dev); 802 + 803 + netif_stop_queue(dev); 804 + free_irq(priv->ctx.spi->irq, priv); 805 + return 0; 806 + } 807 + 808 + static void encx24j600_setrx_proc(struct kthread_work *ws) 809 + { 810 + struct encx24j600_priv *priv = 811 + container_of(ws, struct encx24j600_priv, setrx_work); 812 + 813 + mutex_lock(&priv->lock); 814 + encx24j600_set_rxfilter_mode(priv); 815 + mutex_unlock(&priv->lock); 816 + } 817 + 818 + static void encx24j600_set_multicast_list(struct net_device *dev) 819 + { 820 + struct encx24j600_priv *priv = netdev_priv(dev); 821 + int oldfilter = priv->rxfilter; 822 + 823 + if (dev->flags & IFF_PROMISC) { 824 + netif_dbg(priv, link, dev, "promiscuous mode\n"); 825 + priv->rxfilter = RXFILTER_PROMISC; 826 + } else if ((dev->flags & IFF_ALLMULTI) || !netdev_mc_empty(dev)) { 827 + netif_dbg(priv, link, dev, "%smulticast mode\n", 828 + (dev->flags & IFF_ALLMULTI) ? "all-" : ""); 829 + priv->rxfilter = RXFILTER_MULTI; 830 + } else { 831 + netif_dbg(priv, link, dev, "normal mode\n"); 832 + priv->rxfilter = RXFILTER_NORMAL; 833 + } 834 + 835 + if (oldfilter != priv->rxfilter) 836 + queue_kthread_work(&priv->kworker, &priv->setrx_work); 837 + } 838 + 839 + static void encx24j600_hw_tx(struct encx24j600_priv *priv) 840 + { 841 + struct net_device *dev = priv->ndev; 842 + netif_info(priv, tx_queued, dev, "TX Packet Len:%d\n", 843 + priv->tx_skb->len); 844 + 845 + if (netif_msg_pktdata(priv)) 846 + dump_packet("TX", priv->tx_skb->len, priv->tx_skb->data); 847 + 848 + if (encx24j600_read_reg(priv, EIR) & TXABTIF) 849 + /* Last transmition aborted due to error. Reset TX interface */ 850 + encx24j600_reset_hw_tx(priv); 851 + 852 + /* Clear the TXIF flag if were previously set */ 853 + encx24j600_clr_bits(priv, EIR, TXIF); 854 + 855 + /* Set the data pointer to the TX buffer address in the SRAM */ 856 + encx24j600_write_reg(priv, EGPWRPT, ENC_TX_BUF_START); 857 + 858 + /* Copy the packet into the SRAM */ 859 + encx24j600_raw_write(priv, WGPDATA, (u8 *)priv->tx_skb->data, 860 + priv->tx_skb->len); 861 + 862 + /* Program the Tx buffer start pointer */ 863 + encx24j600_write_reg(priv, ETXST, ENC_TX_BUF_START); 864 + 865 + /* Program the packet length */ 866 + encx24j600_write_reg(priv, ETXLEN, priv->tx_skb->len); 867 + 868 + /* Start the transmission */ 869 + encx24j600_cmd(priv, SETTXRTS); 870 + } 871 + 872 + static void encx24j600_tx_proc(struct kthread_work *ws) 873 + { 874 + struct encx24j600_priv *priv = 875 + container_of(ws, struct encx24j600_priv, tx_work); 876 + 877 + mutex_lock(&priv->lock); 878 + encx24j600_hw_tx(priv); 879 + mutex_unlock(&priv->lock); 880 + } 881 + 882 + static netdev_tx_t encx24j600_tx(struct sk_buff *skb, struct net_device *dev) 883 + { 884 + struct encx24j600_priv *priv = netdev_priv(dev); 885 + 886 + netif_stop_queue(dev); 887 + 888 + /* save the timestamp */ 889 + dev->trans_start = jiffies; 890 + 891 + /* Remember the skb for deferred processing */ 892 + priv->tx_skb = skb; 893 + 894 + queue_kthread_work(&priv->kworker, &priv->tx_work); 895 + 896 + return NETDEV_TX_OK; 897 + } 898 + 899 + /* Deal with a transmit timeout */ 900 + static void encx24j600_tx_timeout(struct net_device *dev) 901 + { 902 + struct encx24j600_priv *priv = netdev_priv(dev); 903 + 904 + netif_err(priv, tx_err, dev, "TX timeout at %ld, latency %ld\n", 905 + jiffies, jiffies - dev->trans_start); 906 + 907 + dev->stats.tx_errors++; 908 + netif_wake_queue(dev); 909 + return; 910 + } 911 + 912 + static int encx24j600_get_regs_len(struct net_device *dev) 913 + { 914 + return SFR_REG_COUNT; 915 + } 916 + 917 + static void encx24j600_get_regs(struct net_device *dev, 918 + struct ethtool_regs *regs, void *p) 919 + { 920 + struct encx24j600_priv *priv = netdev_priv(dev); 921 + u16 *buff = p; 922 + u8 reg; 923 + 924 + regs->version = 1; 925 + mutex_lock(&priv->lock); 926 + for (reg = 0; reg < SFR_REG_COUNT; reg += 2) { 927 + unsigned int val = 0; 928 + /* ignore errors for unreadable registers */ 929 + regmap_read(priv->ctx.regmap, reg, &val); 930 + buff[reg] = val & 0xffff; 931 + } 932 + mutex_unlock(&priv->lock); 933 + } 934 + 935 + static void encx24j600_get_drvinfo(struct net_device *dev, 936 + struct ethtool_drvinfo *info) 937 + { 938 + strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); 939 + strlcpy(info->version, DRV_VERSION, sizeof(info->version)); 940 + strlcpy(info->bus_info, dev_name(dev->dev.parent), 941 + sizeof(info->bus_info)); 942 + } 943 + 944 + static int encx24j600_get_settings(struct net_device *dev, 945 + struct ethtool_cmd *cmd) 946 + { 947 + struct encx24j600_priv *priv = netdev_priv(dev); 948 + 949 + cmd->transceiver = XCVR_INTERNAL; 950 + cmd->supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | 951 + SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | 952 + SUPPORTED_Autoneg | SUPPORTED_TP; 953 + 954 + ethtool_cmd_speed_set(cmd, priv->speed); 955 + cmd->duplex = priv->full_duplex ? DUPLEX_FULL : DUPLEX_HALF; 956 + cmd->port = PORT_TP; 957 + cmd->autoneg = priv->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE; 958 + 959 + return 0; 960 + } 961 + 962 + static int encx24j600_set_settings(struct net_device *dev, 963 + struct ethtool_cmd *cmd) 964 + { 965 + return encx24j600_setlink(dev, cmd->autoneg, 966 + ethtool_cmd_speed(cmd), cmd->duplex); 967 + } 968 + 969 + static u32 encx24j600_get_msglevel(struct net_device *dev) 970 + { 971 + struct encx24j600_priv *priv = netdev_priv(dev); 972 + return priv->msg_enable; 973 + } 974 + 975 + static void encx24j600_set_msglevel(struct net_device *dev, u32 val) 976 + { 977 + struct encx24j600_priv *priv = netdev_priv(dev); 978 + priv->msg_enable = val; 979 + } 980 + 981 + static const struct ethtool_ops encx24j600_ethtool_ops = { 982 + .get_settings = encx24j600_get_settings, 983 + .set_settings = encx24j600_set_settings, 984 + .get_drvinfo = encx24j600_get_drvinfo, 985 + .get_msglevel = encx24j600_get_msglevel, 986 + .set_msglevel = encx24j600_set_msglevel, 987 + .get_regs_len = encx24j600_get_regs_len, 988 + .get_regs = encx24j600_get_regs, 989 + }; 990 + 991 + static const struct net_device_ops encx24j600_netdev_ops = { 992 + .ndo_open = encx24j600_open, 993 + .ndo_stop = encx24j600_stop, 994 + .ndo_start_xmit = encx24j600_tx, 995 + .ndo_set_rx_mode = encx24j600_set_multicast_list, 996 + .ndo_set_mac_address = encx24j600_set_mac_address, 997 + .ndo_tx_timeout = encx24j600_tx_timeout, 998 + .ndo_validate_addr = eth_validate_addr, 999 + }; 1000 + 1001 + static int encx24j600_spi_probe(struct spi_device *spi) 1002 + { 1003 + int ret; 1004 + 1005 + struct net_device *ndev; 1006 + struct encx24j600_priv *priv; 1007 + 1008 + ndev = alloc_etherdev(sizeof(struct encx24j600_priv)); 1009 + 1010 + if (!ndev) { 1011 + ret = -ENOMEM; 1012 + goto error_out; 1013 + } 1014 + 1015 + priv = netdev_priv(ndev); 1016 + spi_set_drvdata(spi, priv); 1017 + dev_set_drvdata(&spi->dev, priv); 1018 + SET_NETDEV_DEV(ndev, &spi->dev); 1019 + 1020 + priv->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); 1021 + priv->ndev = ndev; 1022 + 1023 + /* Default configuration PHY configuration */ 1024 + priv->full_duplex = true; 1025 + priv->autoneg = AUTONEG_ENABLE; 1026 + priv->speed = SPEED_100; 1027 + 1028 + priv->ctx.spi = spi; 1029 + devm_regmap_init_encx24j600(&spi->dev, &priv->ctx); 1030 + ndev->irq = spi->irq; 1031 + ndev->netdev_ops = &encx24j600_netdev_ops; 1032 + 1033 + mutex_init(&priv->lock); 1034 + 1035 + /* Reset device and check if it is connected */ 1036 + if (encx24j600_hw_reset(priv)) { 1037 + netif_err(priv, probe, ndev, 1038 + DRV_NAME ": Chip is not detected\n"); 1039 + ret = -EIO; 1040 + goto out_free; 1041 + } 1042 + 1043 + /* Initialize the device HW to the consistent state */ 1044 + if (encx24j600_hw_init(priv)) { 1045 + netif_err(priv, probe, ndev, 1046 + DRV_NAME ": HW initialization error\n"); 1047 + ret = -EIO; 1048 + goto out_free; 1049 + } 1050 + 1051 + init_kthread_worker(&priv->kworker); 1052 + init_kthread_work(&priv->tx_work, encx24j600_tx_proc); 1053 + init_kthread_work(&priv->setrx_work, encx24j600_setrx_proc); 1054 + 1055 + priv->kworker_task = kthread_run(kthread_worker_fn, &priv->kworker, 1056 + "encx24j600"); 1057 + 1058 + if (IS_ERR(priv->kworker_task)) { 1059 + ret = PTR_ERR(priv->kworker_task); 1060 + goto out_free; 1061 + } 1062 + 1063 + /* Get the MAC address from the chip */ 1064 + encx24j600_hw_get_macaddr(priv, ndev->dev_addr); 1065 + 1066 + ndev->ethtool_ops = &encx24j600_ethtool_ops; 1067 + 1068 + ret = register_netdev(ndev); 1069 + if (unlikely(ret)) { 1070 + netif_err(priv, probe, ndev, "Error %d initializing card encx24j600 card\n", 1071 + ret); 1072 + goto out_free; 1073 + } 1074 + 1075 + netif_info(priv, drv, priv->ndev, "MAC address %pM\n", ndev->dev_addr); 1076 + 1077 + return ret; 1078 + 1079 + out_free: 1080 + free_netdev(ndev); 1081 + 1082 + error_out: 1083 + return ret; 1084 + } 1085 + 1086 + static int encx24j600_spi_remove(struct spi_device *spi) 1087 + { 1088 + struct encx24j600_priv *priv = dev_get_drvdata(&spi->dev); 1089 + 1090 + unregister_netdev(priv->ndev); 1091 + 1092 + free_netdev(priv->ndev); 1093 + 1094 + return 0; 1095 + } 1096 + 1097 + static const struct spi_device_id encx24j600_spi_id_table = { 1098 + .name = "encx24j600" 1099 + }; 1100 + 1101 + static struct spi_driver encx24j600_spi_net_driver = { 1102 + .driver = { 1103 + .name = DRV_NAME, 1104 + .owner = THIS_MODULE, 1105 + .bus = &spi_bus_type, 1106 + }, 1107 + .probe = encx24j600_spi_probe, 1108 + .remove = encx24j600_spi_remove, 1109 + .id_table = &encx24j600_spi_id_table, 1110 + }; 1111 + 1112 + static int __init encx24j600_init(void) 1113 + { 1114 + return spi_register_driver(&encx24j600_spi_net_driver); 1115 + } 1116 + module_init(encx24j600_init); 1117 + 1118 + static void encx24j600_exit(void) 1119 + { 1120 + spi_unregister_driver(&encx24j600_spi_net_driver); 1121 + } 1122 + module_exit(encx24j600_exit); 1123 + 1124 + MODULE_DESCRIPTION(DRV_NAME " ethernet driver"); 1125 + MODULE_AUTHOR("Jon Ringle <jringle@gridpoint.com>"); 1126 + MODULE_LICENSE("GPL"); 1127 + MODULE_ALIAS("spi:" DRV_NAME);
+437
drivers/net/ethernet/microchip/encx24j600_hw.h
··· 1 + /** 2 + * encx24j600_hw.h: Register definitions 3 + * 4 + */ 5 + 6 + #ifndef _ENCX24J600_HW_H 7 + #define _ENCX24J600_HW_H 8 + 9 + struct encx24j600_context { 10 + struct spi_device *spi; 11 + struct regmap *regmap; 12 + struct regmap *phymap; 13 + struct mutex mutex; /* mutex to protect access to regmap */ 14 + int bank; 15 + }; 16 + 17 + void devm_regmap_init_encx24j600(struct device *dev, 18 + struct encx24j600_context *ctx); 19 + 20 + /* Single-byte instructions */ 21 + #define BANK_SELECT(bank) (0xC0 | ((bank & (BANK_MASK >> BANK_SHIFT)) << 1)) 22 + #define B0SEL 0xC0 /* Bank 0 Select */ 23 + #define B1SEL 0xC2 /* Bank 1 Select */ 24 + #define B2SEL 0xC4 /* Bank 2 Select */ 25 + #define B3SEL 0xC6 /* Bank 3 Select */ 26 + #define SETETHRST 0xCA /* System Reset */ 27 + #define FCDISABLE 0xE0 /* Flow Control Disable */ 28 + #define FCSINGLE 0xE2 /* Flow Control Single */ 29 + #define FCMULTIPLE 0xE4 /* Flow Control Multiple */ 30 + #define FCCLEAR 0xE6 /* Flow Control Clear */ 31 + #define SETPKTDEC 0xCC /* Decrement Packet Counter */ 32 + #define DMASTOP 0xD2 /* DMA Stop */ 33 + #define DMACKSUM 0xD8 /* DMA Start Checksum */ 34 + #define DMACKSUMS 0xDA /* DMA Start Checksum with Seed */ 35 + #define DMACOPY 0xDC /* DMA Start Copy */ 36 + #define DMACOPYS 0xDE /* DMA Start Copy and Checksum with Seed */ 37 + #define SETTXRTS 0xD4 /* Request Packet Transmission */ 38 + #define ENABLERX 0xE8 /* Enable RX */ 39 + #define DISABLERX 0xEA /* Disable RX */ 40 + #define SETEIE 0xEC /* Enable Interrupts */ 41 + #define CLREIE 0xEE /* Disable Interrupts */ 42 + 43 + /* Two byte instructions */ 44 + #define RBSEL 0xC8 /* Read Bank Select */ 45 + 46 + /* Three byte instructions */ 47 + #define WGPRDPT 0x60 /* Write EGPRDPT */ 48 + #define RGPRDPT 0x62 /* Read EGPRDPT */ 49 + #define WRXRDPT 0x64 /* Write ERXRDPT */ 50 + #define RRXRDPT 0x66 /* Read ERXRDPT */ 51 + #define WUDARDPT 0x68 /* Write EUDARDPT */ 52 + #define RUDARDPT 0x6A /* Read EUDARDPT */ 53 + #define WGPWRPT 0x6C /* Write EGPWRPT */ 54 + #define RGPWRPT 0x6E /* Read EGPWRPT */ 55 + #define WRXWRPT 0x70 /* Write ERXWRPT */ 56 + #define RRXWRPT 0x72 /* Read ERXWRPT */ 57 + #define WUDAWRPT 0x74 /* Write EUDAWRPT */ 58 + #define RUDAWRPT 0x76 /* Read EUDAWRPT */ 59 + 60 + /* n byte instructions */ 61 + #define RCRCODE 0x00 62 + #define WCRCODE 0x40 63 + #define BFSCODE 0x80 64 + #define BFCCODE 0xA0 65 + #define RCR(addr) (RCRCODE | (addr & ADDR_MASK)) /* Read Control Register */ 66 + #define WCR(addr) (WCRCODE | (addr & ADDR_MASK)) /* Write Control Register */ 67 + #define RCRU 0x20 /* Read Control Register Unbanked */ 68 + #define WCRU 0x22 /* Write Control Register Unbanked */ 69 + #define BFS(addr) (BFSCODE | (addr & ADDR_MASK)) /* Bit Field Set */ 70 + #define BFC(addr) (BFCCODE | (addr & ADDR_MASK)) /* Bit Field Clear */ 71 + #define BFSU 0x24 /* Bit Field Set Unbanked */ 72 + #define BFCU 0x26 /* Bit Field Clear Unbanked */ 73 + #define RGPDATA 0x28 /* Read EGPDATA */ 74 + #define WGPDATA 0x2A /* Write EGPDATA */ 75 + #define RRXDATA 0x2C /* Read ERXDATA */ 76 + #define WRXDATA 0x2E /* Write ERXDATA */ 77 + #define RUDADATA 0x30 /* Read EUDADATA */ 78 + #define WUDADATA 0x32 /* Write EUDADATA */ 79 + 80 + #define SFR_REG_COUNT 0xA0 81 + 82 + /* ENC424J600 Control Registers 83 + * Control register definitions are a combination of address 84 + * and bank number 85 + * - Register address (bits 0-4) 86 + * - Bank number (bits 5-6) 87 + */ 88 + #define ADDR_MASK 0x1F 89 + #define BANK_MASK 0x60 90 + #define BANK_SHIFT 5 91 + 92 + /* All-bank registers */ 93 + #define EUDAST 0x16 94 + #define EUDAND 0x18 95 + #define ESTAT 0x1A 96 + #define EIR 0x1C 97 + #define ECON1 0x1E 98 + 99 + /* Bank 0 registers */ 100 + #define ETXST (0x00 | 0x00) 101 + #define ETXLEN (0x02 | 0x00) 102 + #define ERXST (0x04 | 0x00) 103 + #define ERXTAIL (0x06 | 0x00) 104 + #define ERXHEAD (0x08 | 0x00) 105 + #define EDMAST (0x0A | 0x00) 106 + #define EDMALEN (0x0C | 0x00) 107 + #define EDMADST (0x0E | 0x00) 108 + #define EDMACS (0x10 | 0x00) 109 + #define ETXSTAT (0x12 | 0x00) 110 + #define ETXWIRE (0x14 | 0x00) 111 + 112 + /* Bank 1 registers */ 113 + #define EHT1 (0x00 | 0x20) 114 + #define EHT2 (0x02 | 0x20) 115 + #define EHT3 (0x04 | 0x20) 116 + #define EHT4 (0x06 | 0x20) 117 + #define EPMM1 (0x08 | 0x20) 118 + #define EPMM2 (0x0A | 0x20) 119 + #define EPMM3 (0x0C | 0x20) 120 + #define EPMM4 (0x0E | 0x20) 121 + #define EPMCS (0x10 | 0x20) 122 + #define EPMO (0x12 | 0x20) 123 + #define ERXFCON (0x14 | 0x20) 124 + 125 + /* Bank 2 registers */ 126 + #define MACON1 (0x00 | 0x40) 127 + #define MACON2 (0x02 | 0x40) 128 + #define MABBIPG (0x04 | 0x40) 129 + #define MAIPG (0x06 | 0x40) 130 + #define MACLCON (0x08 | 0x40) 131 + #define MAMXFL (0x0A | 0x40) 132 + #define MICMD (0x12 | 0x40) 133 + #define MIREGADR (0x14 | 0x40) 134 + 135 + /* Bank 3 registers */ 136 + #define MAADR3 (0x00 | 0x60) 137 + #define MAADR2 (0x02 | 0x60) 138 + #define MAADR1 (0x04 | 0x60) 139 + #define MIWR (0x06 | 0x60) 140 + #define MIRD (0x08 | 0x60) 141 + #define MISTAT (0x0A | 0x60) 142 + #define EPAUS (0x0C | 0x60) 143 + #define ECON2 (0x0E | 0x60) 144 + #define ERXWM (0x10 | 0x60) 145 + #define EIE (0x12 | 0x60) 146 + #define EIDLED (0x14 | 0x60) 147 + 148 + /* Unbanked registers */ 149 + #define EGPDATA (0x00 | 0x80) 150 + #define ERXDATA (0x02 | 0x80) 151 + #define EUDADATA (0x04 | 0x80) 152 + #define EGPRDPT (0x06 | 0x80) 153 + #define EGPWRPT (0x08 | 0x80) 154 + #define ERXRDPT (0x0A | 0x80) 155 + #define ERXWRPT (0x0C | 0x80) 156 + #define EUDARDPT (0x0E | 0x80) 157 + #define EUDAWRPT (0x10 | 0x80) 158 + 159 + 160 + /* Register bit definitions */ 161 + /* ESTAT */ 162 + #define INT (1 << 15) 163 + #define FCIDLE (1 << 14) 164 + #define RXBUSY (1 << 13) 165 + #define CLKRDY (1 << 12) 166 + #define PHYDPX (1 << 10) 167 + #define PHYLNK (1 << 8) 168 + 169 + /* EIR */ 170 + #define CRYPTEN (1 << 15) 171 + #define MODEXIF (1 << 14) 172 + #define HASHIF (1 << 13) 173 + #define AESIF (1 << 12) 174 + #define LINKIF (1 << 11) 175 + #define PKTIF (1 << 6) 176 + #define DMAIF (1 << 5) 177 + #define TXIF (1 << 3) 178 + #define TXABTIF (1 << 2) 179 + #define RXABTIF (1 << 1) 180 + #define PCFULIF (1 << 0) 181 + 182 + /* ECON1 */ 183 + #define MODEXST (1 << 15) 184 + #define HASHEN (1 << 14) 185 + #define HASHOP (1 << 13) 186 + #define HASHLST (1 << 12) 187 + #define AESST (1 << 11) 188 + #define AESOP1 (1 << 10) 189 + #define AESOP0 (1 << 9) 190 + #define PKTDEC (1 << 8) 191 + #define FCOP1 (1 << 7) 192 + #define FCOP0 (1 << 6) 193 + #define DMAST (1 << 5) 194 + #define DMACPY (1 << 4) 195 + #define DMACSSD (1 << 3) 196 + #define DMANOCS (1 << 2) 197 + #define TXRTS (1 << 1) 198 + #define RXEN (1 << 0) 199 + 200 + /* ETXSTAT */ 201 + #define LATECOL (1 << 10) 202 + #define MAXCOL (1 << 9) 203 + #define EXDEFER (1 << 8) 204 + #define ETXSTATL_DEFER (1 << 7) 205 + #define CRCBAD (1 << 4) 206 + #define COLCNT_MASK 0xF 207 + 208 + /* ERXFCON */ 209 + #define HTEN (1 << 15) 210 + #define MPEN (1 << 14) 211 + #define NOTPM (1 << 12) 212 + #define PMEN3 (1 << 11) 213 + #define PMEN2 (1 << 10) 214 + #define PMEN1 (1 << 9) 215 + #define PMEN0 (1 << 8) 216 + #define CRCEEN (1 << 7) 217 + #define CRCEN (1 << 6) 218 + #define RUNTEEN (1 << 5) 219 + #define RUNTEN (1 << 4) 220 + #define UCEN (1 << 3) 221 + #define NOTMEEN (1 << 2) 222 + #define MCEN (1 << 1) 223 + #define BCEN (1 << 0) 224 + 225 + /* MACON1 */ 226 + #define LOOPBK (1 << 4) 227 + #define RXPAUS (1 << 2) 228 + #define PASSALL (1 << 1) 229 + 230 + /* MACON2 */ 231 + #define MACON2_DEFER (1 << 14) 232 + #define BPEN (1 << 13) 233 + #define NOBKOFF (1 << 12) 234 + #define PADCFG2 (1 << 7) 235 + #define PADCFG1 (1 << 6) 236 + #define PADCFG0 (1 << 5) 237 + #define TXCRCEN (1 << 4) 238 + #define PHDREN (1 << 3) 239 + #define HFRMEN (1 << 2) 240 + #define MACON2_RSV1 (1 << 1) 241 + #define FULDPX (1 << 0) 242 + 243 + /* MAIPG */ 244 + /* value of the high byte is given by the reserved bits, 245 + * value of the low byte is recomended setting of the 246 + * IPG parameter. 247 + */ 248 + #define MAIPGH_VAL 0x0C 249 + #define MAIPGL_VAL 0x12 250 + 251 + /* MIREGADRH */ 252 + #define MIREGADR_VAL (1 << 8) 253 + 254 + /* MIREGADRL */ 255 + #define PHREG_MASK 0x1F 256 + 257 + /* MICMD */ 258 + #define MIISCAN (1 << 1) 259 + #define MIIRD (1 << 0) 260 + 261 + /* MISTAT */ 262 + #define NVALID (1 << 2) 263 + #define SCAN (1 << 1) 264 + #define BUSY (1 << 0) 265 + 266 + /* ECON2 */ 267 + #define ETHEN (1 << 15) 268 + #define STRCH (1 << 14) 269 + #define TXMAC (1 << 13) 270 + #define SHA1MD5 (1 << 12) 271 + #define COCON3 (1 << 11) 272 + #define COCON2 (1 << 10) 273 + #define COCON1 (1 << 9) 274 + #define COCON0 (1 << 8) 275 + #define AUTOFC (1 << 7) 276 + #define TXRST (1 << 6) 277 + #define RXRST (1 << 5) 278 + #define ETHRST (1 << 4) 279 + #define MODLEN1 (1 << 3) 280 + #define MODLEN0 (1 << 2) 281 + #define AESLEN1 (1 << 1) 282 + #define AESLEN0 (1 << 0) 283 + 284 + /* EIE */ 285 + #define INTIE (1 << 15) 286 + #define MODEXIE (1 << 14) 287 + #define HASHIE (1 << 13) 288 + #define AESIE (1 << 12) 289 + #define LINKIE (1 << 11) 290 + #define PKTIE (1 << 6) 291 + #define DMAIE (1 << 5) 292 + #define TXIE (1 << 3) 293 + #define TXABTIE (1 << 2) 294 + #define RXABTIE (1 << 1) 295 + #define PCFULIE (1 << 0) 296 + 297 + /* EIDLED */ 298 + #define LACFG3 (1 << 15) 299 + #define LACFG2 (1 << 14) 300 + #define LACFG1 (1 << 13) 301 + #define LACFG0 (1 << 12) 302 + #define LBCFG3 (1 << 11) 303 + #define LBCFG2 (1 << 10) 304 + #define LBCFG1 (1 << 9) 305 + #define LBCFG0 (1 << 8) 306 + #define DEVID_SHIFT 5 307 + #define DEVID_MASK (0x7 << DEVID_SHIFT) 308 + #define REVID_SHIFT 0 309 + #define REVID_MASK (0x1F << REVID_SHIFT) 310 + 311 + /* PHY registers */ 312 + #define PHCON1 0x00 313 + #define PHSTAT1 0x01 314 + #define PHANA 0x04 315 + #define PHANLPA 0x05 316 + #define PHANE 0x06 317 + #define PHCON2 0x11 318 + #define PHSTAT2 0x1B 319 + #define PHSTAT3 0x1F 320 + 321 + /* PHCON1 */ 322 + #define PRST (1 << 15) 323 + #define PLOOPBK (1 << 14) 324 + #define SPD100 (1 << 13) 325 + #define ANEN (1 << 12) 326 + #define PSLEEP (1 << 11) 327 + #define RENEG (1 << 9) 328 + #define PFULDPX (1 << 8) 329 + 330 + /* PHSTAT1 */ 331 + #define FULL100 (1 << 14) 332 + #define HALF100 (1 << 13) 333 + #define FULL10 (1 << 12) 334 + #define HALF10 (1 << 11) 335 + #define ANDONE (1 << 5) 336 + #define LRFAULT (1 << 4) 337 + #define ANABLE (1 << 3) 338 + #define LLSTAT (1 << 2) 339 + #define EXTREGS (1 << 0) 340 + 341 + /* PHSTAT2 */ 342 + #define PLRITY (1 << 4) 343 + 344 + /* PHSTAT3 */ 345 + #define PHY3SPD100 (1 << 3) 346 + #define PHY3DPX (1 << 4) 347 + #define SPDDPX_SHIFT 2 348 + #define SPDDPX_MASK (0x7 << SPDDPX_SHIFT) 349 + 350 + /* PHANA */ 351 + /* Default value for PHY initialization*/ 352 + #define PHANA_DEFAULT 0x05E1 353 + 354 + /* PHANE */ 355 + #define PDFLT (1 << 4) 356 + #define LPARCD (1 << 1) 357 + #define LPANABL (1 << 0) 358 + 359 + #define EUDAST_TEST_VAL 0x1234 360 + 361 + #define TSV_SIZE 7 362 + 363 + #define ENCX24J600_DEV_ID 0x1 364 + 365 + /* Configuration */ 366 + 367 + /* Led is on when the link is present and driven low 368 + * temporarily when packet is TX'd or RX'd 369 + */ 370 + #define LED_A_SETTINGS 0xC 371 + 372 + /* Led is on if the link is in 100 Mbps mode */ 373 + #define LED_B_SETTINGS 0x8 374 + 375 + /* maximum ethernet frame length 376 + * Currently not used as a limit anywhere 377 + * (we're using the "huge frame enable" feature of 378 + * enc424j600). 379 + */ 380 + #define MAX_FRAMELEN 1518 381 + 382 + /* Size in bytes of the receive buffer in enc424j600. 383 + * Must be word aligned (even). 384 + */ 385 + #define RX_BUFFER_SIZE (15 * MAX_FRAMELEN) 386 + 387 + /* Start of the general purpose area in sram */ 388 + #define SRAM_GP_START 0x0 389 + 390 + /* SRAM size */ 391 + #define SRAM_SIZE 0x6000 392 + 393 + /* Start of the receive buffer */ 394 + #define ERXST_VAL (SRAM_SIZE - RX_BUFFER_SIZE) 395 + 396 + #define RSV_RXLONGEVDROPEV 16 397 + #define RSV_CARRIEREV 18 398 + #define RSV_CRCERROR 20 399 + #define RSV_LENCHECKERR 21 400 + #define RSV_LENOUTOFRANGE 22 401 + #define RSV_RXOK 23 402 + #define RSV_RXMULTICAST 24 403 + #define RSV_RXBROADCAST 25 404 + #define RSV_DRIBBLENIBBLE 26 405 + #define RSV_RXCONTROLFRAME 27 406 + #define RSV_RXPAUSEFRAME 28 407 + #define RSV_RXUNKNOWNOPCODE 29 408 + #define RSV_RXTYPEVLAN 30 409 + 410 + #define RSV_RUNTFILTERMATCH 31 411 + #define RSV_NOTMEFILTERMATCH 32 412 + #define RSV_HASHFILTERMATCH 33 413 + #define RSV_MAGICPKTFILTERMATCH 34 414 + #define RSV_PTRNMTCHFILTERMATCH 35 415 + #define RSV_UNICASTFILTERMATCH 36 416 + 417 + #define RSV_SIZE 8 418 + #define RSV_BITMASK(x) (1 << ((x) - 16)) 419 + #define RSV_GETBIT(x, y) (((x) & RSV_BITMASK(y)) ? 1 : 0) 420 + 421 + struct rsv { 422 + u16 next_packet; 423 + u16 len; 424 + u32 rxstat; 425 + }; 426 + 427 + /* Put RX buffer at 0 as suggested by the Errata datasheet */ 428 + 429 + #define RXSTART_INIT ERXST_VAL 430 + #define RXEND_INIT 0x5FFF 431 + 432 + int regmap_encx24j600_spi_write(void *context, u8 reg, const u8 *data, 433 + size_t count); 434 + int regmap_encx24j600_spi_read(void *context, u8 reg, u8 *data, size_t count); 435 + 436 + 437 + #endif