root/trunk/patches/2.6.22/41-ixp4xx-net-drivers.patch
| Revision 919, 108.9 kB (checked in by gordon, 2 years ago) |
|---|
-
a/arch/arm/kernel/setup.c
old new 60 60 extern void _stext, _text, _etext, __data_start, _edata, _end; 61 61 62 62 unsigned int processor_id; 63 EXPORT_SYMBOL(processor_id); 63 64 unsigned int __machine_arch_type; 64 65 EXPORT_SYMBOL(__machine_arch_type); 65 66 -
a/arch/arm/mach-ixp4xx/Kconfig
old new 173 173 need to use the indirect method instead. If you don't know 174 174 what you need, leave this option unselected. 175 175 176 config IXP4XX_QMGR 177 tristate "IXP4xx Queue Manager support" 178 help 179 This driver supports IXP4xx built-in hardware queue manager 180 and is automatically selected by Ethernet and HSS drivers. 181 182 config IXP4XX_NPE 183 tristate "IXP4xx Network Processor Engine support" 184 select HOTPLUG 185 select FW_LOADER 186 help 187 This driver supports IXP4xx built-in network coprocessors 188 and is automatically selected by Ethernet and HSS drivers. 189 176 190 endmenu 177 191 178 192 endif -
a/arch/arm/mach-ixp4xx/Makefile
old new 26 26 obj-$(CONFIG_MACH_DSMG600) += dsmg600-setup.o dsmg600-power.o 27 27 28 28 obj-$(CONFIG_PCI) += $(obj-pci-$(CONFIG_PCI)) common-pci.o 29 obj-$(CONFIG_IXP4XX_QMGR) += ixp4xx_qmgr.o 30 obj-$(CONFIG_IXP4XX_NPE) += ixp4xx_npe.o -
a/arch/arm/mach-ixp4xx/ixdp425-setup.c
old new 101 101 .resource = ixdp425_uart_resources 102 102 }; 103 103 104 /* Built-in 10/100 Ethernet MAC interfaces */ 105 static struct eth_plat_info ixdp425_plat_eth[] = { 106 { 107 .phy = 0, 108 .rxq = 3, 109 .txreadyq = 20, 110 }, { 111 .phy = 1, 112 .rxq = 4, 113 .txreadyq = 21, 114 } 115 }; 116 117 static struct platform_device ixdp425_eth[] = { 118 { 119 .name = "ixp4xx_eth", 120 .id = IXP4XX_ETH_NPEB, 121 .dev.platform_data = ixdp425_plat_eth, 122 }, { 123 .name = "ixp4xx_eth", 124 .id = IXP4XX_ETH_NPEC, 125 .dev.platform_data = ixdp425_plat_eth + 1, 126 } 127 }; 128 104 129 static struct platform_device *ixdp425_devices[] __initdata = { 105 130 &ixdp425_i2c_gpio, 106 131 &ixdp425_flash, 107 &ixdp425_uart 132 &ixdp425_uart, 133 &ixdp425_eth[0], 134 &ixdp425_eth[1], 108 135 }; 109 136 110 137 static void __init ixdp425_init(void) -
/dev/null
old new 1 /* 2 * Intel IXP4xx Network Processor Engine driver for Linux 3 * 4 * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of version 2 of the GNU General Public License 8 * as published by the Free Software Foundation. 9 * 10 * The code is based on publicly available information: 11 * - Intel IXP4xx Developer's Manual and other e-papers 12 * - Intel IXP400 Access Library Software (BSD license) 13 * - previous works by Christian Hohnstaedt <chohnstaedt@innominate.com> 14 * Thanks, Christian. 15 */ 16 17 #include <linux/dma-mapping.h> 18 #include <linux/firmware.h> 19 #include <linux/kernel.h> 20 #include <linux/module.h> 21 #include <linux/slab.h> 22 #include <asm/delay.h> 23 #include <asm/io.h> 24 #include <asm/arch/npe.h> 25 26 #define DEBUG_MSG 0 27 #define DEBUG_FW 0 28 29 #define NPE_COUNT 3 30 #define MAX_RETRIES 1000 /* microseconds */ 31 #define NPE_42X_DATA_SIZE 0x800 /* in dwords */ 32 #define NPE_46X_DATA_SIZE 0x1000 33 #define NPE_A_42X_INSTR_SIZE 0x1000 34 #define NPE_B_AND_C_42X_INSTR_SIZE 0x800 35 #define NPE_46X_INSTR_SIZE 0x1000 36 #define REGS_SIZE 0x1000 37 38 #define NPE_PHYS_REG 32 39 40 #define FW_MAGIC 0xFEEDF00D 41 #define FW_BLOCK_TYPE_INSTR 0x0 42 #define FW_BLOCK_TYPE_DATA 0x1 43 #define FW_BLOCK_TYPE_EOF 0xF 44 45 /* NPE exec status (read) and command (write) */ 46 #define CMD_NPE_STEP 0x01 47 #define CMD_NPE_START 0x02 48 #define CMD_NPE_STOP 0x03 49 #define CMD_NPE_CLR_PIPE 0x04 50 #define CMD_CLR_PROFILE_CNT 0x0C 51 #define CMD_RD_INS_MEM 0x10 /* instruction memory */ 52 #define CMD_WR_INS_MEM 0x11 53 #define CMD_RD_DATA_MEM 0x12 /* data memory */ 54 #define CMD_WR_DATA_MEM 0x13 55 #define CMD_RD_ECS_REG 0x14 /* exec access register */ 56 #define CMD_WR_ECS_REG 0x15 57 58 #define STAT_RUN 0x80000000 59 #define STAT_STOP 0x40000000 60 #define STAT_CLEAR 0x20000000 61 #define STAT_ECS_K 0x00800000 /* pipeline clean */ 62 63 #define NPE_STEVT 0x1B 64 #define NPE_STARTPC 0x1C 65 #define NPE_REGMAP 0x1E 66 #define NPE_CINDEX 0x1F 67 68 #define INSTR_WR_REG_SHORT 0x0000C000 69 #define INSTR_WR_REG_BYTE 0x00004000 70 #define INSTR_RD_FIFO 0x0F888220 71 #define INSTR_RESET_MBOX 0x0FAC8210 72 73 #define ECS_BG_CTXT_REG_0 0x00 /* Background Executing Context */ 74 #define ECS_BG_CTXT_REG_1 0x01 /* Stack level */ 75 #define ECS_BG_CTXT_REG_2 0x02 76 #define ECS_PRI_1_CTXT_REG_0 0x04 /* Priority 1 Executing Context */ 77 #define ECS_PRI_1_CTXT_REG_1 0x05 /* Stack level */ 78 #define ECS_PRI_1_CTXT_REG_2 0x06 79 #define ECS_PRI_2_CTXT_REG_0 0x08 /* Priority 2 Executing Context */ 80 #define ECS_PRI_2_CTXT_REG_1 0x09 /* Stack level */ 81 #define ECS_PRI_2_CTXT_REG_2 0x0A 82 #define ECS_DBG_CTXT_REG_0 0x0C /* Debug Executing Context */ 83 #define ECS_DBG_CTXT_REG_1 0x0D /* Stack level */ 84 #define ECS_DBG_CTXT_REG_2 0x0E 85 #define ECS_INSTRUCT_REG 0x11 /* NPE Instruction Register */ 86 87 #define ECS_REG_0_ACTIVE 0x80000000 /* all levels */ 88 #define ECS_REG_0_NEXTPC_MASK 0x1FFF0000 /* BG/PRI1/PRI2 levels */ 89 #define ECS_REG_0_LDUR_BITS 8 90 #define ECS_REG_0_LDUR_MASK 0x00000700 /* all levels */ 91 #define ECS_REG_1_CCTXT_BITS 16 92 #define ECS_REG_1_CCTXT_MASK 0x000F0000 /* all levels */ 93 #define ECS_REG_1_SELCTXT_BITS 0 94 #define ECS_REG_1_SELCTXT_MASK 0x0000000F /* all levels */ 95 #define ECS_DBG_REG_2_IF 0x00100000 /* debug level */ 96 #define ECS_DBG_REG_2_IE 0x00080000 /* debug level */ 97 98 /* NPE watchpoint_fifo register bit */ 99 #define WFIFO_VALID 0x80000000 100 101 /* NPE messaging_status register bit definitions */ 102 #define MSGSTAT_OFNE 0x00010000 /* OutFifoNotEmpty */ 103 #define MSGSTAT_IFNF 0x00020000 /* InFifoNotFull */ 104 #define MSGSTAT_OFNF 0x00040000 /* OutFifoNotFull */ 105 #define MSGSTAT_IFNE 0x00080000 /* InFifoNotEmpty */ 106 #define MSGSTAT_MBINT 0x00100000 /* Mailbox interrupt */ 107 #define MSGSTAT_IFINT 0x00200000 /* InFifo interrupt */ 108 #define MSGSTAT_OFINT 0x00400000 /* OutFifo interrupt */ 109 #define MSGSTAT_WFINT 0x00800000 /* WatchFifo interrupt */ 110 111 /* NPE messaging_control register bit definitions */ 112 #define MSGCTL_OUT_FIFO 0x00010000 /* enable output FIFO */ 113 #define MSGCTL_IN_FIFO 0x00020000 /* enable input FIFO */ 114 #define MSGCTL_OUT_FIFO_WRITE 0x01000000 /* enable FIFO + WRITE */ 115 #define MSGCTL_IN_FIFO_WRITE 0x02000000 116 117 /* NPE mailbox_status value for reset */ 118 #define RESET_MBOX_STAT 0x0000F0F0 119 120 const char *npe_names[] = { "NPE-A", "NPE-B", "NPE-C" }; 121 122 #define print_npe(pri, npe, fmt, ...) \ 123 printk(pri "%s: " fmt, npe_name(npe), ## __VA_ARGS__) 124 125 #if DEBUG_MSG 126 #define debug_msg(npe, fmt, ...) \ 127 print_npe(KERN_DEBUG, npe, fmt, ## __VA_ARGS__) 128 #else 129 #define debug_msg(npe, fmt, ...) 130 #endif 131 132 static struct { 133 u32 reg, val; 134 }ecs_reset[] = { 135 { ECS_BG_CTXT_REG_0, 0xA0000000 }, 136 { ECS_BG_CTXT_REG_1, 0x01000000 }, 137 { ECS_BG_CTXT_REG_2, 0x00008000 }, 138 { ECS_PRI_1_CTXT_REG_0, 0x20000080 }, 139 { ECS_PRI_1_CTXT_REG_1, 0x01000000 }, 140 { ECS_PRI_1_CTXT_REG_2, 0x00008000 }, 141 { ECS_PRI_2_CTXT_REG_0, 0x20000080 }, 142 { ECS_PRI_2_CTXT_REG_1, 0x01000000 }, 143 { ECS_PRI_2_CTXT_REG_2, 0x00008000 }, 144 { ECS_DBG_CTXT_REG_0, 0x20000000 }, 145 { ECS_DBG_CTXT_REG_1, 0x00000000 }, 146 { ECS_DBG_CTXT_REG_2, 0x001E0000 }, 147 { ECS_INSTRUCT_REG, 0x1003C00F }, 148 }; 149 150 static struct npe npe_tab[NPE_COUNT] = { 151 { 152 .id = 0, 153 .regs = (struct npe_regs __iomem *)IXP4XX_NPEA_BASE_VIRT, 154 .regs_phys = IXP4XX_NPEA_BASE_PHYS, 155 }, { 156 .id = 1, 157 .regs = (struct npe_regs __iomem *)IXP4XX_NPEB_BASE_VIRT, 158 .regs_phys = IXP4XX_NPEB_BASE_PHYS, 159 }, { 160 .id = 2, 161 .regs = (struct npe_regs __iomem *)IXP4XX_NPEC_BASE_VIRT, 162 .regs_phys = IXP4XX_NPEC_BASE_PHYS, 163 } 164 }; 165 166 int npe_running(struct npe *npe) 167 { 168 return (__raw_readl(&npe->regs->exec_status_cmd) & STAT_RUN) != 0; 169 } 170 171 static void npe_cmd_write(struct npe *npe, u32 addr, int cmd, u32 data) 172 { 173 __raw_writel(data, &npe->regs->exec_data); 174 __raw_writel(addr, &npe->regs->exec_addr); 175 __raw_writel(cmd, &npe->regs->exec_status_cmd); 176 } 177 178 static u32 npe_cmd_read(struct npe *npe, u32 addr, int cmd) 179 { 180 __raw_writel(addr, &npe->regs->exec_addr); 181 __raw_writel(cmd, &npe->regs->exec_status_cmd); 182 /* Iintroduce extra read cycles after issuing read command to NPE 183 so that we read the register after the NPE has updated it. 184 This is to overcome race condition between XScale and NPE */ 185 __raw_readl(&npe->regs->exec_data); 186 __raw_readl(&npe->regs->exec_data); 187 return __raw_readl(&npe->regs->exec_data); 188 } 189 190 static void npe_clear_active(struct npe *npe, u32 reg) 191 { 192 u32 val = npe_cmd_read(npe, reg, CMD_RD_ECS_REG); 193 npe_cmd_write(npe, reg, CMD_WR_ECS_REG, val & ~ECS_REG_0_ACTIVE); 194 } 195 196 static void npe_start(struct npe *npe) 197 { 198 /* ensure only Background Context Stack Level is active */ 199 npe_clear_active(npe, ECS_PRI_1_CTXT_REG_0); 200 npe_clear_active(npe, ECS_PRI_2_CTXT_REG_0); 201 npe_clear_active(npe, ECS_DBG_CTXT_REG_0); 202 203 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); 204 __raw_writel(CMD_NPE_START, &npe->regs->exec_status_cmd); 205 } 206 207 static void npe_stop(struct npe *npe) 208 { 209 __raw_writel(CMD_NPE_STOP, &npe->regs->exec_status_cmd); 210 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); /*FIXME?*/ 211 } 212 213 static int __must_check npe_debug_instr(struct npe *npe, u32 instr, u32 ctx, 214 u32 ldur) 215 { 216 u32 wc; 217 int i; 218 219 /* set the Active bit, and the LDUR, in the debug level */ 220 npe_cmd_write(npe, ECS_DBG_CTXT_REG_0, CMD_WR_ECS_REG, 221 ECS_REG_0_ACTIVE | (ldur << ECS_REG_0_LDUR_BITS)); 222 223 /* set CCTXT at ECS DEBUG L3 to specify in which context to execute 224 the instruction, and set SELCTXT at ECS DEBUG Level to specify 225 which context store to access. 226 Debug ECS Level Reg 1 has form 0x000n000n, where n = context number 227 */ 228 npe_cmd_write(npe, ECS_DBG_CTXT_REG_1, CMD_WR_ECS_REG, 229 (ctx << ECS_REG_1_CCTXT_BITS) | 230 (ctx << ECS_REG_1_SELCTXT_BITS)); 231 232 /* clear the pipeline */ 233 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); 234 235 /* load NPE instruction into the instruction register */ 236 npe_cmd_write(npe, ECS_INSTRUCT_REG, CMD_WR_ECS_REG, instr); 237 238 /* we need this value later to wait for completion of NPE execution 239 step */ 240 wc = __raw_readl(&npe->regs->watch_count); 241 242 /* issue a Step One command via the Execution Control register */ 243 __raw_writel(CMD_NPE_STEP, &npe->regs->exec_status_cmd); 244 245 /* Watch Count register increments when NPE completes an instruction */ 246 for (i = 0; i < MAX_RETRIES; i++) { 247 if (wc != __raw_readl(&npe->regs->watch_count)) 248 return 0; 249 udelay(1); 250 } 251 252 print_npe(KERN_ERR, npe, "reset: npe_debug_instr(): timeout\n"); 253 return -ETIMEDOUT; 254 } 255 256 static int __must_check npe_logical_reg_write8(struct npe *npe, u32 addr, 257 u8 val, u32 ctx) 258 { 259 /* here we build the NPE assembler instruction: mov8 d0, #0 */ 260 u32 instr = INSTR_WR_REG_BYTE | /* OpCode */ 261 addr << 9 | /* base Operand */ 262 (val & 0x1F) << 4 | /* lower 5 bits to immediate data */ 263 (val & ~0x1F) << (18 - 5);/* higher 3 bits to CoProc instr. */ 264 return npe_debug_instr(npe, instr, ctx, 1); /* execute it */ 265 } 266 267 static int __must_check npe_logical_reg_write16(struct npe *npe, u32 addr, 268 u16 val, u32 ctx) 269 { 270 /* here we build the NPE assembler instruction: mov16 d0, #0 */ 271 u32 instr = INSTR_WR_REG_SHORT | /* OpCode */ 272 addr << 9 | /* base Operand */ 273 (val & 0x1F) << 4 | /* lower 5 bits to immediate data */ 274 (val & ~0x1F) << (18 - 5);/* higher 11 bits to CoProc instr. */ 275 return npe_debug_instr(npe, instr, ctx, 1); /* execute it */ 276 } 277 278 static int __must_check npe_logical_reg_write32(struct npe *npe, u32 addr, 279 u32 val, u32 ctx) 280 { 281 /* write in 16 bit steps first the high and then the low value */ 282 if (npe_logical_reg_write16(npe, addr, val >> 16, ctx)) 283 return -ETIMEDOUT; 284 return npe_logical_reg_write16(npe, addr + 2, val & 0xFFFF, ctx); 285 } 286 287 static int npe_reset(struct npe *npe) 288 { 289 u32 val, ctl, exec_count, ctx_reg2; 290 int i; 291 292 ctl = (__raw_readl(&npe->regs->messaging_control) | 0x3F000000) & 293 0x3F3FFFFF; 294 295 /* disable parity interrupt */ 296 __raw_writel(ctl & 0x3F00FFFF, &npe->regs->messaging_control); 297 298 /* pre exec - debug instruction */ 299 /* turn off the halt bit by clearing Execution Count register. */ 300 exec_count = __raw_readl(&npe->regs->exec_count); 301 __raw_writel(0, &npe->regs->exec_count); 302 /* ensure that IF and IE are on (temporarily), so that we don't end up 303 stepping forever */ 304 ctx_reg2 = npe_cmd_read(npe, ECS_DBG_CTXT_REG_2, CMD_RD_ECS_REG); 305 npe_cmd_write(npe, ECS_DBG_CTXT_REG_2, CMD_WR_ECS_REG, ctx_reg2 | 306 ECS_DBG_REG_2_IF | ECS_DBG_REG_2_IE); 307 308 /* clear the FIFOs */ 309 while (__raw_readl(&npe->regs->watchpoint_fifo) & WFIFO_VALID) 310 ; 311 while (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_OFNE) 312 /* read from the outFIFO until empty */ 313 print_npe(KERN_DEBUG, npe, "npe_reset: read FIFO = 0x%X\n", 314 __raw_readl(&npe->regs->in_out_fifo)); 315 316 while (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE) 317 /* step execution of the NPE intruction to read inFIFO using 318 the Debug Executing Context stack */ 319 if (npe_debug_instr(npe, INSTR_RD_FIFO, 0, 0)) 320 return -ETIMEDOUT; 321 322 /* reset the mailbox reg from the XScale side */ 323 __raw_writel(RESET_MBOX_STAT, &npe->regs->mailbox_status); 324 /* from NPE side */ 325 if (npe_debug_instr(npe, INSTR_RESET_MBOX, 0, 0)) 326 return -ETIMEDOUT; 327 328 /* Reset the physical registers in the NPE register file */ 329 for (val = 0; val < NPE_PHYS_REG; val++) { 330 if (npe_logical_reg_write16(npe, NPE_REGMAP, val >> 1, 0)) 331 return -ETIMEDOUT; 332 /* address is either 0 or 4 */ 333 if (npe_logical_reg_write32(npe, (val & 1) * 4, 0, 0)) 334 return -ETIMEDOUT; 335 } 336 337 /* Reset the context store = each context's Context Store registers */ 338 339 /* Context 0 has no STARTPC. Instead, this value is used to set NextPC 340 for Background ECS, to set where NPE starts executing code */ 341 val = npe_cmd_read(npe, ECS_BG_CTXT_REG_0, CMD_RD_ECS_REG); 342 val &= ~ECS_REG_0_NEXTPC_MASK; 343 val |= (0 /* NextPC */ << 16) & ECS_REG_0_NEXTPC_MASK; 344 npe_cmd_write(npe, ECS_BG_CTXT_REG_0, CMD_WR_ECS_REG, val); 345 346 for (i = 0; i < 16; i++) { 347 if (i) { /* Context 0 has no STEVT nor STARTPC */ 348 /* STEVT = off, 0x80 */ 349 if (npe_logical_reg_write8(npe, NPE_STEVT, 0x80, i)) 350 return -ETIMEDOUT; 351 if (npe_logical_reg_write16(npe, NPE_STARTPC, 0, i)) 352 return -ETIMEDOUT; 353 } 354 /* REGMAP = d0->p0, d8->p2, d16->p4 */ 355 if (npe_logical_reg_write16(npe, NPE_REGMAP, 0x820, i)) 356 return -ETIMEDOUT; 357 if (npe_logical_reg_write8(npe, NPE_CINDEX, 0, i)) 358 return -ETIMEDOUT; 359 } 360 361 /* post exec */ 362 /* clear active bit in debug level */ 363 npe_cmd_write(npe, ECS_DBG_CTXT_REG_0, CMD_WR_ECS_REG, 0); 364 /* clear the pipeline */ 365 __raw_writel(CMD_NPE_CLR_PIPE, &npe->regs->exec_status_cmd); 366 /* restore previous values */ 367 __raw_writel(exec_count, &npe->regs->exec_count); 368 npe_cmd_write(npe, ECS_DBG_CTXT_REG_2, CMD_WR_ECS_REG, ctx_reg2); 369 370 /* write reset values to Execution Context Stack registers */ 371 for (val = 0; val < ARRAY_SIZE(ecs_reset); val++) 372 npe_cmd_write(npe, ecs_reset[val].reg, CMD_WR_ECS_REG, 373 ecs_reset[val].val); 374 375 /* clear the profile counter */ 376 __raw_writel(CMD_CLR_PROFILE_CNT, &npe->regs->exec_status_cmd); 377 378 __raw_writel(0, &npe->regs->exec_count); 379 __raw_writel(0, &npe->regs->action_points[0]); 380 __raw_writel(0, &npe->regs->action_points[1]); 381 __raw_writel(0, &npe->regs->action_points[2]); 382 __raw_writel(0, &npe->regs->action_points[3]); 383 __raw_writel(0, &npe->regs->watch_count); 384 385 val = ixp4xx_read_fuses(); 386 /* reset the NPE */ 387 ixp4xx_write_fuses(val & ~(IXP4XX_FUSE_RESET_NPEA << npe->id)); 388 for (i = 0; i < MAX_RETRIES; i++) { 389 if (!(ixp4xx_read_fuses() & 390 (IXP4XX_FUSE_RESET_NPEA << npe->id))) 391 break; /* reset completed */ 392 udelay(1); 393 } 394 if (i == MAX_RETRIES) 395 return -ETIMEDOUT; 396 397 /* deassert reset */ 398 ixp4xx_write_fuses(val | (IXP4XX_FUSE_RESET_NPEA << npe->id)); 399 for (i = 0; i < MAX_RETRIES; i++) { 400 if (ixp4xx_read_fuses() & (IXP4XX_FUSE_RESET_NPEA << npe->id)) 401 break; /* NPE is back alive */ 402 udelay(1); 403 } 404 if (i == MAX_RETRIES) 405 return -ETIMEDOUT; 406 407 npe_stop(npe); 408 409 /* restore NPE configuration bus Control Register - parity settings */ 410 __raw_writel(ctl, &npe->regs->messaging_control); 411 return 0; 412 } 413 414 415 int npe_send_message(struct npe *npe, const void *msg, const char *what) 416 { 417 const u32 *send = msg; 418 int cycles = 0; 419 420 debug_msg(npe, "Trying to send message %s [%08X:%08X]\n", 421 what, send[0], send[1]); 422 423 if (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE) { 424 debug_msg(npe, "NPE input FIFO not empty\n"); 425 return -EIO; 426 } 427 428 __raw_writel(send[0], &npe->regs->in_out_fifo); 429 430 if (!(__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNF)) { 431 debug_msg(npe, "NPE input FIFO full\n"); 432 return -EIO; 433 } 434 435 __raw_writel(send[1], &npe->regs->in_out_fifo); 436 437 while ((cycles < MAX_RETRIES) && 438 (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_IFNE)) { 439 udelay(1); 440 cycles++; 441 } 442 443 if (cycles == MAX_RETRIES) { 444 debug_msg(npe, "Timeout sending message\n"); 445 return -ETIMEDOUT; 446 } 447 448 debug_msg(npe, "Sending a message took %i cycles\n", cycles); 449 return 0; 450 } 451 452 int npe_recv_message(struct npe *npe, void *msg, const char *what) 453 { 454 u32 *recv = msg; 455 int cycles = 0, cnt = 0; 456 457 debug_msg(npe, "Trying to receive message %s\n", what); 458 459 while (cycles < MAX_RETRIES) { 460 if (__raw_readl(&npe->regs->messaging_status) & MSGSTAT_OFNE) { 461 recv[cnt++] = __raw_readl(&npe->regs->in_out_fifo); 462 if (cnt == 2) 463 break; 464 } else { 465 udelay(1); 466 cycles++; 467 } 468 } 469 470 switch(cnt) { 471 case 1: 472 debug_msg(npe, "Received [%08X]\n", recv[0]); 473 break; 474 case 2: 475 debug_msg(npe, "Received [%08X:%08X]\n", recv[0], recv[1]); 476 break; 477 } 478 479 if (cycles == MAX_RETRIES) { 480 debug_msg(npe, "Timeout waiting for message\n"); 481 return -ETIMEDOUT; 482 } 483 484 debug_msg(npe, "Receiving a message took %i cycles\n", cycles); 485 return 0; 486 } 487 488 int npe_send_recv_message(struct npe *npe, void *msg, const char *what) 489 { 490 int result; 491 u32 *send = msg, recv[2]; 492 493 if ((result = npe_send_message(npe, msg, what)) != 0) 494 return result; 495 if ((result = npe_recv_message(npe, recv, what)) != 0) 496 return result; 497 498 if ((recv[0] != send[0]) || (recv[1] != send[1])) { 499 debug_msg(npe, "Message %s: unexpected message received\n", 500 what); 501 return -EIO; 502 } 503 return 0; 504 } 505 506 507 int npe_load_firmware(struct npe *npe, const char *name, struct device *dev) 508 { 509 const struct firmware *fw_entry; 510 511 struct dl_block { 512 u32 type; 513 u32 offset; 514 } *blk; 515 516 struct dl_image { 517 u32 magic; 518 u32 id; 519 u32 size; 520 union { 521 u32 data[0]; 522 struct dl_block blocks[0]; 523 }; 524 } *image; 525 526 struct dl_codeblock { 527 u32 npe_addr; 528 u32 size; 529 u32 data[0]; 530 } *cb; 531 532 int i, j, err, data_size, instr_size, blocks, table_end; 533 u32 cmd; 534 535 if ((err = request_firmware(&fw_entry, name, dev)) != 0) 536 return err; 537 538 err = -EINVAL; 539 if (fw_entry->size < sizeof(struct dl_image)) { 540 print_npe(KERN_ERR, npe, "incomplete firmware file\n"); 541 goto err; 542 } 543 image = (struct dl_image*)fw_entry->data; 544 545 #if DEBUG_FW 546 print_npe(KERN_DEBUG, npe, "firmware: %08X %08X %08X (0x%X bytes)\n", 547 image->magic, image->id, image->size, image->size * 4); 548 #endif 549 550 if (image->magic == swab32(FW_MAGIC)) { /* swapped file */ 551 image->id = swab32(image->id); 552 image->size = swab32(image->size); 553 } else if (image->magic != FW_MAGIC) { 554 print_npe(KERN_ERR, npe, "bad firmware file magic: 0x%X\n", 555 image->magic); 556 goto err; 557 } 558 if ((image->size * 4 + sizeof(struct dl_image)) != fw_entry->size) { 559 print_npe(KERN_ERR, npe, 560 "inconsistent size of firmware file\n"); 561 goto err; 562 } 563 if (((image->id >> 24) & 0xF /* NPE ID */) != npe->id) { 564 print_npe(KERN_ERR, npe, "firmware file NPE ID mismatch\n"); 565 goto err; 566 } 567 if (image->magic == swab32(FW_MAGIC)) 568 for (i = 0; i < image->size; i++) 569 image->data[i] = swab32(image->data[i]); 570 571 if (!cpu_is_ixp46x() && ((image->id >> 28) & 0xF /* device ID */)) { 572 print_npe(KERN_INFO, npe, "IXP46x firmware ignored on " 573 "IXP42x\n"); 574 goto err; 575 } 576 577 if (npe_running(npe)) { 578 print_npe(KERN_INFO, npe, "unable to load firmware, NPE is " 579 "already running\n"); 580 err = -EBUSY; 581 goto err; 582 } 583 #if 0 584 npe_stop(npe); 585 npe_reset(npe); 586 #endif 587 588 print_npe(KERN_INFO, npe, "firmware functionality 0x%X, " 589 "revision 0x%X:%X\n", (image->id >> 16) & 0xFF, 590 (image->id >> 8) & 0xFF, image->id & 0xFF); 591 592 if (!cpu_is_ixp46x()) { 593 if (!npe->id) 594 instr_size = NPE_A_42X_INSTR_SIZE; 595 else 596 instr_size = NPE_B_AND_C_42X_INSTR_SIZE; 597 data_size = NPE_42X_DATA_SIZE; 598 } else { 599 instr_size = NPE_46X_INSTR_SIZE; 600 data_size = NPE_46X_DATA_SIZE; 601 } 602 603 for (blocks = 0; blocks * sizeof(struct dl_block) / 4 < image->size; 604 blocks++) 605 if (image->blocks[blocks].type == FW_BLOCK_TYPE_EOF) 606 break; 607 if (blocks * sizeof(struct dl_block) / 4 >= image->size) { 608 print_npe(KERN_INFO, npe, "firmware EOF block marker not " 609 "found\n"); 610 goto err; 611 } 612 613 #if DEBUG_FW 614 print_npe(KERN_DEBUG, npe, "%i firmware blocks found\n", blocks); 615 #endif 616 617 table_end = blocks * sizeof(struct dl_block) / 4 + 1 /* EOF marker */; 618 for (i = 0, blk = image->blocks; i < blocks; i++, blk++) { 619 if (blk->offset > image->size - sizeof(struct dl_codeblock) / 4 620 || blk->offset < table_end) { 621 print_npe(KERN_INFO, npe, "invalid offset 0x%X of " 622 "firmware block #%i\n", blk->offset, i); 623 goto err; 624 } 625 626 cb = (struct dl_codeblock*)&image->data[blk->offset]; 627 if (blk->type == FW_BLOCK_TYPE_INSTR) { 628 if (cb->npe_addr + cb->size > instr_size) 629 goto too_big; 630 cmd = CMD_WR_INS_MEM; 631 } else if (blk->type == FW_BLOCK_TYPE_DATA) { 632 if (cb->npe_addr + cb->size > data_size) 633 goto too_big; 634 cmd = CMD_WR_DATA_MEM; 635 } else { 636 print_npe(KERN_INFO, npe, "invalid firmware block #%i " 637 "type 0x%X\n", i, blk->type); 638 goto err; 639 } 640 if (blk->offset + sizeof(*cb) / 4 + cb->size > image->size) { 641 print_npe(KERN_INFO, npe, "firmware block #%i doesn't " 642 "fit in firmware image: type %c, start 0x%X," 643 " length 0x%X\n", i, 644 blk->type == FW_BLOCK_TYPE_INSTR ? 'I' : 'D', 645 cb->npe_addr, cb->size); 646 goto err; 647 } 648 649 for (j = 0; j < cb->size; j++) 650 npe_cmd_write(npe, cb->npe_addr + j, cmd, cb->data[j]); 651 } 652 653 npe_start(npe); 654 if (!npe_running(npe)) 655 print_npe(KERN_ERR, npe, "unable to start\n"); 656 release_firmware(fw_entry); 657 return 0; 658 659 too_big: 660 print_npe(KERN_INFO, npe, "firmware block #%i doesn't fit in NPE " 661 "memory: type %c, start 0x%X, length 0x%X\n", i, 662 blk->type == FW_BLOCK_TYPE_INSTR ? 'I' : 'D', 663 cb->npe_addr, cb->size); 664 err: 665 release_firmware(fw_entry); 666 return err; 667 } 668 669 670 struct npe *npe_request(int id) 671 { 672 if (id < NPE_COUNT) 673 if (npe_tab[id].valid) 674 if (try_module_get(THIS_MODULE)) 675 return &npe_tab[id]; 676 return NULL; 677 } 678 679 void npe_release(struct npe *npe) 680 { 681 module_put(THIS_MODULE); 682 } 683 684 685 static int __init npe_init_module(void) 686 { 687 688 int i, found = 0; 689 690 for (i = 0; i < NPE_COUNT; i++) { 691 struct npe *npe = &npe_tab[i]; 692 if (!(ixp4xx_read_fuses() & (IXP4XX_FUSE_RESET_NPEA << i))) 693 continue; /* NPE already disabled or not present */ 694 if (!(npe->mem_res = request_mem_region(npe->regs_phys, 695 REGS_SIZE, 696 npe_name(npe)))) { 697 print_npe(KERN_ERR, npe, 698 "failed to request memory region\n"); 699 continue; 700 } 701 702 if (npe_reset(npe)) 703 continue; 704 npe->valid = 1; 705 found++; 706 } 707 708 if (!found) 709 return -ENOSYS; 710 return 0; 711 } 712 713 static void __exit npe_cleanup_module(void) 714 { 715 int i; 716 717 for (i = 0; i < NPE_COUNT; i++) 718 if (npe_tab[i].mem_res) { 719 npe_reset(&npe_tab[i]); 720 release_resource(npe_tab[i].mem_res); 721 } 722 } 723 724 module_init(npe_init_module); 725 module_exit(npe_cleanup_module); 726 727 MODULE_AUTHOR("Krzysztof Halasa"); 728 MODULE_LICENSE("GPL v2"); 729 730 EXPORT_SYMBOL(npe_names); 731 EXPORT_SYMBOL(npe_running); 732 EXPORT_SYMBOL(npe_request); 733 EXPORT_SYMBOL(npe_release); 734 EXPORT_SYMBOL(npe_load_firmware); 735 EXPORT_SYMBOL(npe_send_message); 736 EXPORT_SYMBOL(npe_recv_message); 737 EXPORT_SYMBOL(npe_send_recv_message); -
/dev/null
old new 1 /* 2 * Intel IXP4xx Queue Manager driver for Linux 3 * 4 * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of version 2 of the GNU General Public License 8 * as published by the Free Software Foundation. 9 */ 10 11 #include <linux/ioport.h> 12 #include <linux/interrupt.h> 13 #include <linux/kernel.h> 14 #include <linux/module.h> 15 #include <asm/arch/qmgr.h> 16 17 #define DEBUG 0 18 19 struct qmgr_regs __iomem *qmgr_regs; 20 static struct resource *mem_res; 21 static spinlock_t qmgr_lock; 22 static u32 used_sram_bitmap[4]; /* 128 16-dword pages */ 23 static void (*irq_handlers[HALF_QUEUES])(void *pdev); 24 static void *irq_pdevs[HALF_QUEUES]; 25 26 void qmgr_set_irq(unsigned int queue, int src, 27 void (*handler)(void *pdev), void *pdev) 28 { 29 u32 __iomem *reg = &qmgr_regs->irqsrc[queue / 8]; /* 8 queues / u32 */ 30 int bit = (queue % 8) * 4; /* 3 bits + 1 reserved bit per queue */ 31 unsigned long flags; 32 33 src &= 7; 34 spin_lock_irqsave(&qmgr_lock, flags); 35 __raw_writel((__raw_readl(reg) & ~(7 << bit)) | (src << bit), reg); 36 irq_handlers[queue] = handler; 37 irq_pdevs[queue] = pdev; 38 spin_unlock_irqrestore(&qmgr_lock, flags); 39 } 40 41 42 static irqreturn_t qmgr_irq1(int irq, void *pdev) 43 { 44 int i; 45 u32 val = __raw_readl(&qmgr_regs->irqstat[0]); 46 __raw_writel(val, &qmgr_regs->irqstat[0]); /* ACK */ 47 48 for (i = 0; i < HALF_QUEUES; i++) 49 if (val & (1 << i)) 50 irq_handlers[i](irq_pdevs[i]); 51 52 return val ? IRQ_HANDLED : 0; 53 } 54 55 56 void qmgr_enable_irq(unsigned int queue) 57 { 58 unsigned long flags; 59 60 spin_lock_irqsave(&qmgr_lock, flags); 61 __raw_writel(__raw_readl(&qmgr_regs->irqen[0]) | (1 << queue), 62 &qmgr_regs->irqen[0]); 63 spin_unlock_irqrestore(&qmgr_lock, flags); 64 } 65 66 void qmgr_disable_irq(unsigned int queue) 67 { 68 unsigned long flags; 69 70 spin_lock_irqsave(&qmgr_lock, flags); 71 __raw_writel(__raw_readl(&qmgr_regs->irqen[0]) & ~(1 << queue), 72 &qmgr_regs->irqen[0]); 73 spin_unlock_irqrestore(&qmgr_lock, flags); 74 } 75 76 static inline void shift_mask(u32 *mask) 77 { 78 mask[3] = mask[3] << 1 | mask[2] >> 31; 79 mask[2] = mask[2] << 1 | mask[1] >> 31; 80 mask[1] = mask[1] << 1 | mask[0] >> 31; 81 mask[0] <<= 1; 82 } 83 84 int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */, 85 unsigned int nearly_empty_watermark, 86 unsigned int nearly_full_watermark) 87 { 88 u32 cfg, addr = 0, mask[4]; /* in 16-dwords */ 89 int err; 90 91 if (queue >= HALF_QUEUES) 92 return -ERANGE; 93 94 if ((nearly_empty_watermark | nearly_full_watermark) & ~7) 95 return -EINVAL; 96 97 switch (len) { 98 case 16: 99 cfg = 0 << 24; 100 mask[0] = 0x1; 101 break; 102 case 32: 103 cfg = 1 << 24; 104 mask[0] = 0x3; 105 break; 106 case 64: 107 cfg = 2 << 24; 108 mask[0] = 0xF; 109 break; 110 case 128: 111 cfg = 3 << 24; 112 mask[0] = 0xFF; 113 break; 114 default: 115 return -EINVAL; 116 } 117 118 cfg |= nearly_empty_watermark << 26; 119 cfg |= nearly_full_watermark << 29; 120 len /= 16; /* in 16-dwords: 1, 2, 4 or 8 */ 121 mask[1] = mask[2] = mask[3] = 0; 122 123 if (!try_module_get(THIS_MODULE)) 124 return -ENODEV; 125 126 spin_lock_irq(&qmgr_lock); 127 if (__raw_readl(&qmgr_regs->sram[queue])) { 128 err = -EBUSY; 129 goto err; 130 } 131 132 while (1) { 133 if (!(used_sram_bitmap[0] & mask[0]) && 134 !(used_sram_bitmap[1] & mask[1]) && 135 !(used_sram_bitmap[2] & mask[2]) && 136 !(used_sram_bitmap[3] & mask[3])) 137 break; /* found free space */ 138 139 addr++; 140 shift_mask(mask); 141 if (addr + len > ARRAY_SIZE(qmgr_regs->sram)) { 142 printk(KERN_ERR "qmgr: no free SRAM space for" 143 " queue %i\n", queue); 144 err = -ENOMEM; 145 goto err; 146 } 147 } 148 149 used_sram_bitmap[0] |= mask[0]; 150 used_sram_bitmap[1] |= mask[1]; 151 used_sram_bitmap[2] |= mask[2]; 152 used_sram_bitmap[3] |= mask[3]; 153 __raw_writel(cfg | (addr << 14), &qmgr_regs->sram[queue]); 154 spin_unlock_irq(&qmgr_lock); 155 156 #if DEBUG 157 printk(KERN_DEBUG "qmgr: requested queue %i, addr = 0x%02X\n", 158 queue, addr); 159 #endif 160 return 0; 161 162 err: 163 spin_unlock_irq(&qmgr_lock); 164 module_put(THIS_MODULE); 165 return err; 166 } 167 168 void qmgr_release_queue(unsigned int queue) 169 { 170 u32 cfg, addr, mask[4]; 171 172 BUG_ON(queue >= HALF_QUEUES); /* not in valid range */ 173 174 spin_lock_irq(&qmgr_lock); 175 cfg = __raw_readl(&qmgr_regs->sram[queue]); 176 addr = (cfg >> 14) & 0xFF; 177 178 BUG_ON(!addr); /* not requested */ 179 180 switch ((cfg >> 24) & 3) { 181 case 0: mask[0] = 0x1; break; 182 case 1: mask[0] = 0x3; break; 183 case 2: mask[0] = 0xF; break; 184 case 3: mask[0] = 0xFF; break; 185 } 186 187 while (addr--) 188 shift_mask(mask); 189 190 __raw_writel(0, &qmgr_regs->sram[queue]); 191 192 used_sram_bitmap[0] &= ~mask[0]; 193 used_sram_bitmap[1] &= ~mask[1]; 194 used_sram_bitmap[2] &= ~mask[2]; 195 used_sram_bitmap[3] &= ~mask[3]; 196 irq_handlers[queue] = NULL; /* catch IRQ bugs */ 197 spin_unlock_irq(&qmgr_lock); 198 199 module_put(THIS_MODULE); 200 #if DEBUG 201 printk(KERN_DEBUG "qmgr: released queue %i\n", queue); 202 #endif 203 } 204 205 static int qmgr_init(void) 206 { 207 int i, err; 208 mem_res = request_mem_region(IXP4XX_QMGR_BASE_PHYS, 209 IXP4XX_QMGR_REGION_SIZE, 210 "IXP4xx Queue Manager"); 211 if (mem_res == NULL) 212 return -EBUSY; 213 214 qmgr_regs = ioremap(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); 215 if (qmgr_regs == NULL) { 216 err = -ENOMEM; 217 goto error_map; 218 } 219 220 /* reset qmgr registers */ 221 for (i = 0; i < 4; i++) { 222 __raw_writel(0x33333333, &qmgr_regs->stat1[i]); 223 __raw_writel(0, &qmgr_regs->irqsrc[i]); 224 } 225 for (i = 0; i < 2; i++) { 226 __raw_writel(0, &qmgr_regs->stat2[i]); 227 __raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[i]); /* clear */ 228 __raw_writel(0, &qmgr_regs->irqen[i]); 229 } 230 231 for (i = 0; i < QUEUES; i++) 232 __raw_writel(0, &qmgr_regs->sram[i]); 233 234 err = request_irq(IRQ_IXP4XX_QM1, qmgr_irq1, 0, 235 "IXP4xx Queue Manager", NULL); 236 if (err) { 237 printk(KERN_ERR "qmgr: failed to request IRQ%i\n", 238 IRQ_IXP4XX_QM1); 239 goto error_irq; 240 } 241 242 used_sram_bitmap[0] = 0xF; /* 4 first pages reserved for config */ 243 spin_lock_init(&qmgr_lock); 244 245 printk(KERN_INFO "IXP4xx Queue Manager initialized.\n"); 246 return 0; 247 248 error_irq: 249 iounmap(qmgr_regs); 250 error_map: 251 release_resource(mem_res); 252 return err; 253 } 254 255 static void qmgr_remove(void) 256 { 257 free_irq(IRQ_IXP4XX_QM1, NULL); 258 synchronize_irq(IRQ_IXP4XX_QM1); 259 iounmap(qmgr_regs); 260 release_resource(mem_res); 261 } 262 263 module_init(qmgr_init); 264 module_exit(qmgr_remove); 265 266 MODULE_LICENSE("GPL v2"); 267 MODULE_AUTHOR("Krzysztof Halasa"); 268 269 EXPORT_SYMBOL(qmgr_regs); 270 EXPORT_SYMBOL(qmgr_set_irq); 271 EXPORT_SYMBOL(qmgr_enable_irq); 272 EXPORT_SYMBOL(qmgr_disable_irq); 273 EXPORT_SYMBOL(qmgr_request_queue); 274 EXPORT_SYMBOL(qmgr_release_queue); -
a/drivers/net/arm/Kconfig
old new 46 46 help 47 47 This is a driver for the ethernet hardware included in EP93xx CPUs. 48 48 Say Y if you are building a kernel for EP93xx based devices. 49 50 config IXP4XX_ETH 51 tristate "IXP4xx Ethernet support" 52 depends on NET_ETHERNET && ARM && ARCH_IXP4XX 53 select IXP4XX_NPE 54 select IXP4XX_QMGR 55 select MII 56 help 57 Say Y here if you want to use built-in Ethernet ports 58 on IXP4xx processor. -
a/drivers/net/arm/Makefile
old new 9 9 obj-$(CONFIG_ARM_ETHER1) += ether1.o 10 10 obj-$(CONFIG_ARM_AT91_ETHER) += at91_ether.o 11 11 obj-$(CONFIG_EP93XX_ETH) += ep93xx_eth.o 12 obj-$(CONFIG_IXP4XX_ETH) += ixp4xx_eth.o -
/dev/null
old new 1 /* 2 * Intel IXP4xx Ethernet driver for Linux 3 * 4 * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of version 2 of the GNU General Public License 8 * as published by the Free Software Foundation. 9 * 10 * Ethernet port config (0x00 is not present on IXP42X): 11 * 12 * logical port 0x00 0x10 0x20 13 * NPE 0 (NPE-A) 1 (NPE-B) 2 (NPE-C) 14 * physical PortId 2 0 1 15 * TX queue 23 24 25 16 * RX-free queue 26 27 28 17 * TX-done queue is always 31, per-port RX and TX-ready queues are configurable 18 * 19 * 20 * Queue entries: 21 * bits 0 -> 1 - NPE ID (RX and TX-done) 22 * bits 0 -> 2 - priority (TX, per 802.1D) 23 * bits 3 -> 4 - port ID (user-set?) 24 * bits 5 -> 31 - physical descriptor address 25 */ 26 27 #include <linux/delay.h> 28 #include <linux/dma-mapping.h> 29 #include <linux/dmapool.h> 30 #include <linux/kernel.h> 31 #include <linux/mii.h> 32 #include <linux/platform_device.h> 33 #include <asm/io.h> 34 #include <asm/arch/npe.h> 35 #include <asm/arch/qmgr.h> 36 37 #define DEBUG_QUEUES 0 38 #define DEBUG_DESC 0 39 #define DEBUG_RX 0 40 #define DEBUG_TX 0 41 #define DEBUG_PKT_BYTES 0 42 #define DEBUG_MDIO 0 43 #define DEBUG_CLOSE 0 44 45 #define DRV_NAME "ixp4xx_eth" 46 47 #define MAX_NPES 3 48 49 #define RX_DESCS 64 /* also length of all RX queues */ 50 #define TX_DESCS 16 /* also length of all TX queues */ 51 #define TXDONE_QUEUE_LEN 64 /* dwords */ 52 53 #define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS)) 54 #define REGS_SIZE 0x1000 55 #define MAX_MRU 1536 /* 0x600 */ 56 57 #define MDIO_INTERVAL (3 * HZ) 58 #define MAX_MDIO_RETRIES 100 /* microseconds, typically 30 cycles */ 59 #define MAX_MII_RESET_RETRIES 100 /* mdio_read() cycles, typically 4 */ 60 #define MAX_CLOSE_WAIT 1000 /* microseconds, typically 2-3 cycles */ 61 62 #define NPE_ID(port_id) ((port_id) >> 4) 63 #define PHYSICAL_ID(port_id) ((NPE_ID(port_id) + 2) % 3) 64 #define TX_QUEUE(port_id) (NPE_ID(port_id) + 23) 65 #define RXFREE_QUEUE(port_id) (NPE_ID(port_id) + 26) 66 #define TXDONE_QUEUE 31 67 68 /* TX Control Registers */ 69 #define TX_CNTRL0_TX_EN 0x01 70 #define TX_CNTRL0_HALFDUPLEX 0x02 71 #define TX_CNTRL0_RETRY 0x04 72 #define TX_CNTRL0_PAD_EN 0x08 73 #define TX_CNTRL0_APPEND_FCS 0x10 74 #define TX_CNTRL0_2DEFER 0x20 75 #define TX_CNTRL0_RMII 0x40 /* reduced MII */ 76 #define TX_CNTRL1_RETRIES 0x0F /* 4 bits */ 77 78 /* RX Control Registers */ 79 #define RX_CNTRL0_RX_EN 0x01 80 #define RX_CNTRL0_PADSTRIP_EN 0x02 81 #define RX_CNTRL0_SEND_FCS 0x04 82 #define RX_CNTRL0_PAUSE_EN 0x08 83 #define RX_CNTRL0_LOOP_EN 0x10 84 #define RX_CNTRL0_ADDR_FLTR_EN 0x20 85 #define RX_CNTRL0_RX_RUNT_EN 0x40 86 #define RX_CNTRL0_BCAST_DIS 0x80 87 #define RX_CNTRL1_DEFER_EN 0x01 88 89 /* Core Control Register */ 90 #define CORE_RESET 0x01 91 #define CORE_RX_FIFO_FLUSH 0x02 92 #define CORE_TX_FIFO_FLUSH 0x04 93 #define CORE_SEND_JAM 0x08 94 #define CORE_MDC_EN 0x10 /* MDIO using NPE-B ETH-0 only */ 95 96 #define DEFAULT_TX_CNTRL0 (TX_CNTRL0_TX_EN | TX_CNTRL0_RETRY | \ 97 TX_CNTRL0_PAD_EN | TX_CNTRL0_APPEND_FCS | \ 98 TX_CNTRL0_2DEFER) 99 #define DEFAULT_RX_CNTRL0 RX_CNTRL0_RX_EN 100 #define DEFAULT_CORE_CNTRL CORE_MDC_EN 101 102 103 /* NPE message codes */ 104 #define NPE_GETSTATUS 0x00 105 #define NPE_EDB_SETPORTADDRESS 0x01 106 #define NPE_EDB_GETMACADDRESSDATABASE 0x02 107 #define NPE_EDB_SETMACADDRESSSDATABASE 0x03 108 #define NPE_GETSTATS 0x04 109 #define NPE_RESETSTATS 0x05 110 #define NPE_SETMAXFRAMELENGTHS 0x06 111 #define NPE_VLAN_SETRXTAGMODE 0x07 112 #define NPE_VLAN_SETDEFAULTRXVID 0x08 113 #define NPE_VLAN_SETPORTVLANTABLEENTRY 0x09 114 #define NPE_VLAN_SETPORTVLANTABLERANGE 0x0A 115 #define NPE_VLAN_SETRXQOSENTRY 0x0B 116 #define NPE_VLAN_SETPORTIDEXTRACTIONMODE 0x0C 117 #define NPE_STP_SETBLOCKINGSTATE 0x0D 118 #define NPE_FW_SETFIREWALLMODE 0x0E 119 #define NPE_PC_SETFRAMECONTROLDURATIONID 0x0F 120 #define NPE_PC_SETAPMACTABLE 0x11 121 #define NPE_SETLOOPBACK_MODE 0x12 122 #define NPE_PC_SETBSSIDTABLE 0x13 123 #define NPE_ADDRESS_FILTER_CONFIG 0x14 124 #define NPE_APPENDFCSCONFIG 0x15 125 #define NPE_NOTIFY_MAC_RECOVERY_DONE 0x16 126 #define NPE_MAC_RECOVERY_START 0x17 127 128 129 #ifdef __ARMEB__ 130 typedef struct sk_buff buffer_t; 131 #define free_buffer dev_kfree_skb 132 #define free_buffer_irq dev_kfree_skb_irq 133 #else 134 typedef void buffer_t; 135 #define free_buffer kfree 136 #define free_buffer_irq kfree 137 #endif 138 139 struct eth_regs { 140 u32 tx_control[2], __res1[2]; /* 000 */ 141 u32 rx_control[2], __res2[2]; /* 010 */ 142 u32 random_seed, __res3[3]; /* 020 */ 143 u32 partial_empty_threshold, __res4; /* 030 */ 144 u32 partial_full_threshold, __res5; /* 038 */ 145 u32 tx_start_bytes, __res6[3]; /* 040 */ 146 u32 tx_deferral, rx_deferral,__res7[2]; /* 050 */ 147 u32 tx_2part_deferral[2], __res8[2]; /* 060 */ 148 u32 slot_time, __res9[3]; /* 070 */ 149 u32 mdio_command[4]; /* 080 */ 150 u32 mdio_status[4]; /* 090 */ 151 u32 mcast_mask[6], __res10[2]; /* 0A0 */ 152 u32 mcast_addr[6], __res11[2]; /* 0C0 */ 153 u32 int_clock_threshold, __res12[3]; /* 0E0 */ 154 u32 hw_addr[6], __res13[61]; /* 0F0 */ 155 u32 core_control; /* 1FC */ 156 }; 157 158 struct port { 159 struct resource *mem_res; 160 struct eth_regs __iomem *regs; 161 struct npe *npe; 162 struct net_device *netdev; 163 struct net_device_stats stat; 164 struct mii_if_info mii; 165 struct delayed_work mdio_thread; 166 struct eth_plat_info *plat; 167 buffer_t *rx_buff_tab[RX_DESCS], *tx_buff_tab[TX_DESCS]; 168 struct desc *desc_tab; /* coherent */ 169 u32 desc_tab_phys; 170 int id; /* logical port ID */ 171 u16 mii_bmcr; 172 }; 173 174 /* NPE message structure */ 175 struct msg { 176 #ifdef __ARMEB__ 177 u8 cmd, eth_id, byte2, byte3; 178 u8 byte4, byte5, byte6, byte7; 179 #else 180 u8 byte3, byte2, eth_id, cmd; 181 u8 byte7, byte6, byte5, byte4; 182 #endif 183 }; 184 185 /* Ethernet packet descriptor */ 186 struct desc { 187 u32 next; /* pointer to next buffer, unused */ 188 189 #ifdef __ARMEB__ 190 u16 buf_len; /* buffer length */ 191 u16 pkt_len; /* packet length */ 192 u32 data; /* pointer to data buffer in RAM */ 193 u8 dest_id; 194 u8 src_id; 195 u16 flags; 196 u8 qos; 197 u8 padlen; 198 u16 vlan_tci; 199 #else 200 u16 pkt_len; /* packet length */ 201 u16 buf_len; /* buffer length */ 202 u32 data; /* pointer to data buffer in RAM */ 203 u16 flags; 204 u8 src_id; 205 u8 dest_id; 206 u16 vlan_tci; 207 u8 padlen; 208 u8 qos; 209 #endif 210 211 #ifdef __ARMEB__ 212 u8 dst_mac_0, dst_mac_1, dst_mac_2, dst_mac_3; 213 u8 dst_mac_4, dst_mac_5, src_mac_0, src_mac_1; 214 u8 src_mac_2, src_mac_3, src_mac_4, src_mac_5; 215 #else 216 u8 dst_mac_3, dst_mac_2, dst_mac_1, dst_mac_0; 217 u8 src_mac_1, src_mac_0, dst_mac_5, dst_mac_4; 218 u8 src_mac_5, src_mac_4, src_mac_3, src_mac_2; 219 #endif 220 }; 221 222 223 #define rx_desc_phys(port, n) ((port)->desc_tab_phys + \ 224 (n) * sizeof(struct desc)) 225 #define rx_desc_ptr(port, n) (&(port)->desc_tab[n]) 226 227 #define tx_desc_phys(port, n) ((port)->desc_tab_phys + \ 228 ((n) + RX_DESCS) * sizeof(struct desc)) 229 #define tx_desc_ptr(port, n) (&(port)->desc_tab[(n) + RX_DESCS]) 230 231 #ifndef __ARMEB__ 232 static inline void memcpy_swab32(u32 *dest, u32 *src, int cnt) 233 { 234 int i; 235 for (i = 0; i < cnt; i++) 236 dest[i] = swab32(src[i]); 237 } 238 #endif 239 240 static spinlock_t mdio_lock; 241 static struct eth_regs __iomem *mdio_regs; /* mdio command and status only */ 242 static int ports_open; 243 static struct port *npe_port_tab[MAX_NPES]; 244 static struct dma_pool *dma_pool; 245 246 247 static u16 mdio_cmd(struct net_device *dev, int phy_id, int location, 248 int write, u16 cmd) 249 { 250 int cycles = 0; 251 252 if (__raw_readl(&mdio_regs->mdio_command[3]) & 0x80) { 253 printk(KERN_ERR "%s: MII not ready to transmit\n", dev->name); 254 return 0; 255 } 256 257 if (write) { 258 __raw_writel(cmd & 0xFF, &mdio_regs->mdio_command[0]); 259 __raw_writel(cmd >> 8, &mdio_regs->mdio_command[1]); 260 } 261 __raw_writel(((phy_id << 5) | location) & 0xFF, 262 &mdio_regs->mdio_command[2]); 263 __raw_writel((phy_id >> 3) | (write << 2) | 0x80 /* GO */, 264 &mdio_regs->mdio_command[3]); 265 266 while ((cycles < MAX_MDIO_RETRIES) && 267 (__raw_readl(&mdio_regs->mdio_command[3]) & 0x80)) { 268 udelay(1); 269 cycles++; 270 } 271 272 if (cycles == MAX_MDIO_RETRIES) { 273 printk(KERN_ERR "%s: MII write failed\n", dev->name); 274 return 0; 275 } 276 277 #if DEBUG_MDIO 278 printk(KERN_DEBUG "%s: mdio_cmd() took %i cycles\n", dev->name, 279 cycles); 280 #endif 281 282 if (write) 283 return 0; 284 285 if (__raw_readl(&mdio_regs->mdio_status[3]) & 0x80) { 286 printk(KERN_ERR "%s: MII read failed\n", dev->name); 287 return 0; 288 } 289 290 return (__raw_readl(&mdio_regs->mdio_status[0]) & 0xFF) | 291 (__raw_readl(&mdio_regs->mdio_status[1]) << 8); 292 } 293 294 static int mdio_read(struct net_device *dev, int phy_id, int location) 295 { 296 unsigned long flags; 297 u16 val; 298 299 spin_lock_irqsave(&mdio_lock, flags); 300 val = mdio_cmd(dev, phy_id, location, 0, 0); 301 spin_unlock_irqrestore(&mdio_lock, flags); 302 return val; 303 } 304 305 static void mdio_write(struct net_device *dev, int phy_id, int location, 306 int val) 307 { 308 unsigned long flags; 309 310 spin_lock_irqsave(&mdio_lock, flags); 311 mdio_cmd(dev, phy_id, location, 1, val); 312 spin_unlock_irqrestore(&mdio_lock, flags); 313 } 314 315 static void phy_reset(struct net_device *dev, int phy_id) 316 { 317 struct port *port = netdev_priv(dev); 318 int cycles = 0; 319 320 mdio_write(dev, phy_id, MII_BMCR, port->mii_bmcr | BMCR_RESET); 321 322 while (cycles < MAX_MII_RESET_RETRIES) { 323 if (!(mdio_read(dev, phy_id, MII_BMCR) & BMCR_RESET)) { 324 #if DEBUG_MDIO 325 printk(KERN_DEBUG "%s: phy_reset() took %i cycles\n", 326 dev->name, cycles); 327 #endif 328 return; 329 } 330 udelay(1); 331 cycles++; 332 } 333 334 printk(KERN_ERR "%s: MII reset failed\n", dev->name); 335 } 336 337 static void eth_set_duplex(struct port *port) 338 { 339 if (port->mii.full_duplex) 340 __raw_writel(DEFAULT_TX_CNTRL0 & ~TX_CNTRL0_HALFDUPLEX, 341 &port->regs->tx_control[0]); 342 else 343 __raw_writel(DEFAULT_TX_CNTRL0 | TX_CNTRL0_HALFDUPLEX, 344 &port->regs->tx_control[0]); 345 } 346 347 348 static void phy_check_media(struct port *port, int init) 349 { 350 if (mii_check_media(&port->mii, 1, init)) 351 eth_set_duplex(port); 352 if (port->mii.force_media) { /* mii_check_media() doesn't work */ 353 struct net_device *dev = port->netdev; 354 int cur_link = mii_link_ok(&port->mii); 355 int prev_link = netif_carrier_ok(dev); 356 357 if (!prev_link && cur_link) { 358 printk(KERN_INFO "%s: link up\n", dev->name); 359 netif_carrier_on(dev); 360 } else if (prev_link && !cur_link) { 361 printk(KERN_INFO "%s: link down\n", dev->name); 362 netif_carrier_off(dev); 363 } 364 } 365 } 366 367 368 static void mdio_thread(struct work_struct *work) 369 { 370 struct port *port = container_of(work, struct port, mdio_thread.work); 371 372 phy_check_media(port, 0); 373 schedule_delayed_work(&port->mdio_thread, MDIO_INTERVAL); 374 } 375 376 377 static inline void debug_pkt(struct net_device *dev, const char *func, 378 u8 *data, int len) 379 { 380 #if DEBUG_PKT_BYTES 381 int i; 382 383 printk(KERN_DEBUG "%s: %s(%i) ", dev->name, func, len); 384 for (i = 0; i < len; i++) { 385 if (i >= DEBUG_PKT_BYTES) 386 break; 387 printk("%s%02X", 388 ((i == 6) || (i == 12) || (i >= 14)) ? " " : "", 389 data[i]); 390 } 391 printk("\n"); 392 #endif 393 } 394 395 396 static inline void debug_desc(u32 phys, struct desc *desc) 397 { 398 #if DEBUG_DESC 399 printk(KERN_DEBUG "%X: %X %3X %3X %08X %2X < %2X %4X %X" 400 " %X %X %02X%02X%02X%02X%02X%02X < %02X%02X%02X%02X%02X%02X\n", 401 phys, desc->next, desc->buf_len, desc->pkt_len, 402 desc->data, desc->dest_id, desc->src_id, desc->flags, 403 desc->qos, desc->padlen, desc->vlan_tci, 404 desc->dst_mac_0, desc->dst_mac_1, desc->dst_mac_2, 405 desc->dst_mac_3, desc->dst_mac_4, desc->dst_mac_5, 406 desc->src_mac_0, desc->src_mac_1, desc->src_mac_2, 407 desc->src_mac_3, desc->src_mac_4, desc->src_mac_5); 408 #endif 409 } 410 411 static inline void debug_queue(unsigned int queue, int is_get, u32 phys) 412 { 413 #if DEBUG_QUEUES 414 static struct { 415 int queue; 416 char *name; 417 } names[] = { 418 { TX_QUEUE(0x10), "TX#0 " }, 419 { TX_QUEUE(0x20), "TX#1 " }, 420 { TX_QUEUE(0x00), "TX#2 " }, 421 { RXFREE_QUEUE(0x10), "RX-free#0 " }, 422 { RXFREE_QUEUE(0x20), "RX-free#1 " }, 423 { RXFREE_QUEUE(0x00), "RX-free#2 " }, 424 { TXDONE_QUEUE, "TX-done " }, 425 }; 426 int i; 427 428 for (i = 0; i < ARRAY_SIZE(names); i++) 429 if (names[i].queue == queue) 430 break; 431 432 printk(KERN_DEBUG "Queue %i %s%s %X\n", queue, 433 i < ARRAY_SIZE(names) ? names[i].name : "", 434 is_get ? "->" : "<-", phys); 435 #endif 436 } 437 438 static inline u32 queue_get_entry(unsigned int queue) 439 { 440 u32 phys = qmgr_get_entry(queue); 441 debug_queue(queue, 1, phys); 442 return phys; 443 } 444 445 static inline int queue_get_desc(unsigned int queue, struct port *port, 446 int is_tx) 447 { 448 u32 phys, tab_phys, n_desc; 449 struct desc *tab; 450 451 if (!(phys = queue_get_entry(queue))) 452 return -1; 453 454 phys &= ~0x1F; /* mask out non-address bits */ 455 tab_phys = is_tx ? tx_desc_phys(port, 0) : rx_desc_phys(port, 0); 456 tab = is_tx ? tx_desc_ptr(port, 0) : rx_desc_ptr(port, 0); 457 n_desc = (phys - tab_phys) / sizeof(struct desc); 458 BUG_ON(n_desc >= (is_tx ? TX_DESCS : RX_DESCS)); 459 debug_desc(phys, &tab[n_desc]); 460 BUG_ON(tab[n_desc].next); 461 return n_desc; 462 } 463 464 static inline void queue_put_desc(unsigned int queue, u32 phys, 465 struct desc *desc) 466 { 467 debug_queue(queue, 0, phys); 468 debug_desc(phys, desc); 469 BUG_ON(phys & 0x1F); 470 qmgr_put_entry(queue, phys); 471 BUG_ON(qmgr_stat_overflow(queue)); 472 } 473 474 475 static inline void dma_unmap_tx(struct port *port, struct desc *desc) 476 { 477 #ifdef __ARMEB__ 478 dma_unmap_single(&port->netdev->dev, desc->data, 479 desc->buf_len, DMA_TO_DEVICE); 480 #else 481 dma_unmap_single(&port->netdev->dev, desc->data & ~3, 482 ALIGN((desc->data & 3) + desc->buf_len, 4), 483 DMA_TO_DEVICE); 484 #endif 485 } 486 487 488 static void eth_rx_irq(void *pdev) 489 { 490 struct net_device *dev = pdev; 491 struct port *port = netdev_priv(dev); 492 493 #if DEBUG_RX 494 printk(KERN_DEBUG "%s: eth_rx_irq\n", dev->name); 495 #endif 496 qmgr_disable_irq(port->plat->rxq); 497 netif_rx_schedule(dev); 498 } 499 500 static int eth_poll(struct net_device *dev, int *budget) 501 { 502 struct port *port = netdev_priv(dev); 503 unsigned int rxq = port->plat->rxq, rxfreeq = RXFREE_QUEUE(port->id); 504 int quota = dev->quota, received = 0; 505 506 #if DEBUG_RX 507 printk(KERN_DEBUG "%s: eth_poll\n", dev->name); 508 #endif 509 510 while (quota) { 511 struct sk_buff *skb; 512 struct desc *desc; 513 int n; 514 #ifdef __ARMEB__ 515 struct sk_buff *temp; 516 u32 phys; 517 #endif 518 519 if ((n = queue_get_desc(rxq, port, 0)) < 0) { 520 dev->quota -= received; /* No packet received */ 521 *budget -= received; 522 received = 0; 523 #if DEBUG_RX 524 printk(KERN_DEBUG "%s: eth_poll netif_rx_complete\n", 525 dev->name); 526 #endif 527 netif_rx_complete(dev); 528 qmgr_enable_irq(rxq); 529 if (!qmgr_stat_empty(rxq) && 530 netif_rx_reschedule(dev, 0)) { 531 #if DEBUG_RX 532 printk(KERN_DEBUG "%s: eth_poll" 533 " netif_rx_reschedule successed\n", 534 dev->name); 535 #endif 536 qmgr_disable_irq(rxq); 537 continue; 538 } 539 #if DEBUG_RX 540 printk(KERN_DEBUG "%s: eth_poll all done\n", 541 dev->name); 542 #endif 543 return 0; /* all work done */ 544 } 545 546 desc = rx_desc_ptr(port, n); 547 548 #ifdef __ARMEB__ 549 if ((skb = netdev_alloc_skb(dev, MAX_MRU)) != NULL) { 550 phys = dma_map_single(&dev->dev, skb->data, 551 MAX_MRU, DMA_FROM_DEVICE); 552 if (dma_mapping_error(phys)) { 553 dev_kfree_skb(skb); 554 skb = NULL; 555 } 556 } 557 #else 558 skb = netdev_alloc_skb(dev, desc->pkt_len); 559 #endif 560 561 if (!skb) { 562 port->stat.rx_dropped++; 563 /* put the desc back on RX-ready queue */ 564 desc->buf_len = MAX_MRU; 565 desc->pkt_len = 0; 566 queue_put_desc(rxfreeq, rx_desc_phys(port, n), desc); 567 continue; 568 } 569 570 /* process received frame */ 571 #ifdef __ARMEB__ 572 temp = skb; 573 skb = port->rx_buff_tab[n]; 574 dma_unmap_single(&dev->dev, desc->data, 575 MAX_MRU, DMA_FROM_DEVICE); 576 #else 577 dma_sync_single(&dev->dev, desc->data, 578 MAX_MRU, DMA_FROM_DEVICE); 579 memcpy_swab32((u32 *)skb->data, (u32 *)port->rx_buff_tab[n], 580 ALIGN(desc->pkt_len, 4) / 4); 581 #endif 582 skb_put(skb, desc->pkt_len); 583 584 debug_pkt(dev, "eth_poll", skb->data, skb->len); 585 586 skb->protocol = eth_type_trans(skb, dev); 587 dev->last_rx = jiffies; 588 port->stat.rx_packets++; 589 port->stat.rx_bytes += skb->len; 590 netif_receive_skb(skb); 591 592 /* put the new buffer on RX-free queue */ 593 #ifdef __ARMEB__ 594 port->rx_buff_tab[n] = temp; 595 desc->data = phys; 596 #endif 597 desc->buf_len = MAX_MRU; 598 desc->pkt_len = 0; 599 queue_put_desc(rxfreeq, rx_desc_phys(port, n), desc); 600 quota--; 601 received++; 602 } 603 dev->quota -= received; 604 *budget -= received; 605 #if DEBUG_RX 606 printk(KERN_DEBUG "eth_poll(): end, not all work done\n"); 607 #endif 608 return 1; /* not all work done */ 609 } 610 611 612 static void eth_txdone_irq(void *unused) 613 { 614 u32 phys; 615 616 #if DEBUG_TX 617 printk(KERN_DEBUG DRV_NAME ": eth_txdone_irq\n"); 618 #endif 619 while ((phys = queue_get_entry(TXDONE_QUEUE)) != 0) { 620 u32 npe_id, n_desc; 621 struct port *port; 622 struct desc *desc; 623 int start; 624 625 npe_id = phys & 3; 626 BUG_ON(npe_id >= MAX_NPES); 627 port = npe_port_tab[npe_id]; 628 BUG_ON(!port); 629 phys &= ~0x1F; /* mask out non-address bits */ 630 n_desc = (phys - tx_desc_phys(port, 0)) / sizeof(struct desc); 631 BUG_ON(n_desc >= TX_DESCS); 632 desc = tx_desc_ptr(port, n_desc); 633 debug_desc(phys, desc); 634 635 if (port->tx_buff_tab[n_desc]) { /* not the draining packet */ 636 port->stat.tx_packets++; 637 port->stat.tx_bytes += desc->pkt_len; 638 639 dma_unmap_tx(port, desc); 640 #if DEBUG_TX 641 printk(KERN_DEBUG "%s: eth_txdone_irq free %p\n", 642 port->netdev->name, port->tx_buff_tab[n_desc]); 643 #endif 644 free_buffer_irq(port->tx_buff_tab[n_desc]); 645 port->tx_buff_tab[n_desc] = NULL; 646 } 647 648 start = qmgr_stat_empty(port->plat->txreadyq); 649 queue_put_desc(port->plat->txreadyq, phys, desc); 650 if (start) { 651 #if DEBUG_TX 652 printk(KERN_DEBUG "%s: eth_txdone_irq xmit ready\n", 653 port->netdev->name); 654 #endif 655 netif_wake_queue(port->netdev); 656 } 657 } 658 } 659 660 static int eth_xmit(struct sk_buff *skb, struct net_device *dev) 661 { 662 struct port *port = netdev_priv(dev); 663 unsigned int txreadyq = port->plat->txreadyq; 664 int len, offset, bytes, n; 665 void *mem; 666 u32 phys; 667 struct desc *desc; 668 669 #if DEBUG_TX 670 printk(KERN_DEBUG "%s: eth_xmit\n", dev->name); 671 #endif 672 673 if (unlikely(skb->len > MAX_MRU)) { 674 dev_kfree_skb(skb); 675 port->stat.tx_errors++; 676 return NETDEV_TX_OK; 677 } 678 679 debug_pkt(dev, "eth_xmit", skb->data, skb->len); 680 681 len = skb->len; 682 #ifdef __ARMEB__ 683 offset = 0; /* no need to keep alignment */ 684 bytes = len; 685 mem = skb->data; 686 #else 687 offset = (int)skb->data & 3; /* keep 32-bit alignment */ 688 bytes = ALIGN(offset + len, 4); 689 if (!(mem = kmalloc(bytes, GFP_ATOMIC))) { 690 dev_kfree_skb(skb); 691 port->stat.tx_dropped++; 692 return NETDEV_TX_OK; 693 } 694 memcpy_swab32(mem, (u32 *)((int)skb->data & ~3), bytes / 4); 695 dev_kfree_skb(skb); 696 #endif 697 698 phys = dma_map_single(&dev->dev, mem, bytes, DMA_TO_DEVICE); 699 if (dma_mapping_error(phys)) { 700 #ifdef __ARMEB__ 701 dev_kfree_skb(skb); 702 #else 703 kfree(mem); 704 #endif 705 port->stat.tx_dropped++; 706 return NETDEV_TX_OK; 707 } 708 709 n = queue_get_desc(txreadyq, port, 1); 710 BUG_ON(n < 0); 711 desc = tx_desc_ptr(port, n); 712 713 #ifdef __ARMEB__ 714 port->tx_buff_tab[n] = skb; 715 #else 716 port->tx_buff_tab[n] = mem; 717 #endif 718 desc->data = phys + offset; 719 desc->buf_len = desc->pkt_len = len; 720 721 /* NPE firmware pads short frames with zeros internally */ 722 wmb(); 723 queue_put_desc(TX_QUEUE(port->id), tx_desc_phys(port, n), desc); 724 dev->trans_start = jiffies; 725 726 if (qmgr_stat_empty(txreadyq)) { 727 #if DEBUG_TX 728 printk(KERN_DEBUG "%s: eth_xmit queue full\n", dev->name); 729 #endif 730 netif_stop_queue(dev); 731 /* we could miss TX ready interrupt */ 732 if (!qmgr_stat_empty(txreadyq)) { 733 #if DEBUG_TX 734 printk(KERN_DEBUG "%s: eth_xmit ready again\n", 735 dev->name); 736 #endif 737 netif_wake_queue(dev); 738 } 739 } 740 741 #if DEBUG_TX 742 printk(KERN_DEBUG "%s: eth_xmit end\n", dev->name); 743 #endif 744 return NETDEV_TX_OK; 745 } 746 747 748 static struct net_device_stats *eth_stats(struct net_device *dev) 749 { 750 struct port *port = netdev_priv(dev); 751 return &port->stat; 752 } 753 754 static void eth_set_mcast_list(struct net_device *dev) 755 { 756 struct port *port = netdev_priv(dev); 757 struct dev_mc_list *mclist = dev->mc_list; 758 u8 diffs[ETH_ALEN], *addr; 759 int cnt = dev->mc_count, i; 760 761 if ((dev->flags & IFF_PROMISC) || !mclist || !cnt) { 762 __raw_writel(DEFAULT_RX_CNTRL0 & ~RX_CNTRL0_ADDR_FLTR_EN, 763 &port->regs->rx_control[0]); 764 return; 765 } 766 767 memset(diffs, 0, ETH_ALEN); 768 addr = mclist->dmi_addr; /* first MAC address */ 769 770 while (--cnt && (mclist = mclist->next)) 771 for (i = 0; i < ETH_ALEN; i++) 772 diffs[i] |= addr[i] ^ mclist->dmi_addr[i]; 773 774 for (i = 0; i < ETH_ALEN; i++) { 775 __raw_writel(addr[i], &port->regs->mcast_addr[i]); 776 __raw_writel(~diffs[i], &port->regs->mcast_mask[i]); 777 } 778 779 __raw_writel(DEFAULT_RX_CNTRL0 | RX_CNTRL0_ADDR_FLTR_EN, 780 &port->regs->rx_control[0]); 781 } 782 783 784 static int eth_ioctl(struct net_device *dev, struct ifreq *req, int cmd) 785 { 786 struct port *port = netdev_priv(dev); 787 unsigned int duplex_chg; 788 int err; 789 790 if (!netif_running(dev)) 791 return -EINVAL; 792 err = generic_mii_ioctl(&port->mii, if_mii(req), cmd, &duplex_chg); 793 if (duplex_chg) 794 eth_set_duplex(port); 795 return err; 796 } 797 798 799 static int request_queues(struct port *port) 800 { 801 int err; 802 803 err = qmgr_request_queue(RXFREE_QUEUE(port->id), RX_DESCS, 0, 0); 804 if (err) 805 return err; 806 807 err = qmgr_request_queue(port->plat->rxq, RX_DESCS, 0, 0); 808 if (err) 809 goto rel_rxfree; 810 811 err = qmgr_request_queue(TX_QUEUE(port->id), TX_DESCS, 0, 0); 812 if (err) 813 goto rel_rx; 814 815 err = qmgr_request_queue(port->plat->txreadyq, TX_DESCS, 0, 0); 816 if (err) 817 goto rel_tx; 818 819 /* TX-done queue handles skbs sent out by the NPEs */ 820 if (!ports_open) { 821 err = qmgr_request_queue(TXDONE_QUEUE, TXDONE_QUEUE_LEN, 0, 0); 822 if (err) 823 goto rel_txready; 824 } 825 return 0; 826 827 rel_txready: 828 qmgr_release_queue(port->plat->txreadyq); 829 rel_tx: 830 qmgr_release_queue(TX_QUEUE(port->id)); 831 rel_rx: 832 qmgr_release_queue(port->plat->rxq); 833 rel_rxfree: 834 qmgr_release_queue(RXFREE_QUEUE(port->id)); 835 printk(KERN_DEBUG "%s: unable to request hardware queues\n", 836 port->netdev->name); 837 return err; 838 } 839 840 static void release_queues(struct port *port) 841 { 842 qmgr_release_queue(RXFREE_QUEUE(port->id)); 843 qmgr_release_queue(port->plat->rxq); 844 qmgr_release_queue(TX_QUEUE(port->id)); 845 qmgr_release_queue(port->plat->txreadyq); 846 847 if (!ports_open) 848 qmgr_release_queue(TXDONE_QUEUE); 849 } 850 851 static int init_queues(struct port *port) 852 { 853 int i; 854 855 if (!ports_open) 856 if (!(dma_pool = dma_pool_create(DRV_NAME, NULL, 857 POOL_ALLOC_SIZE, 32, 0))) 858 return -ENOMEM; 859 860 if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, 861 &port->desc_tab_phys))) 862 return -ENOMEM; 863 memset(port->desc_tab, 0, POOL_ALLOC_SIZE); 864 memset(port->rx_buff_tab, 0, sizeof(port->rx_buff_tab)); /* tables */ 865 memset(port->tx_buff_tab, 0, sizeof(port->tx_buff_tab)); 866 867 /* Setup RX buffers */ 868 for (i = 0; i < RX_DESCS; i++) { 869 struct desc *desc = rx_desc_ptr(port, i); 870 buffer_t *buff; 871 void *data; 872 #ifdef __ARMEB__ 873 if (!(buff = netdev_alloc_skb(port->netdev, MAX_MRU))) 874 return -ENOMEM; 875 data = buff->data; 876 #else 877 if (!(buff = kmalloc(MAX_MRU, GFP_KERNEL))) 878 return -ENOMEM; 879 data = buff; 880 #endif 881 desc->buf_len = MAX_MRU; 882 desc->data = dma_map_single(&port->netdev->dev, data, 883 MAX_MRU, DMA_FROM_DEVICE); 884 if (dma_mapping_error(desc->data)) { 885 free_buffer(buff); 886 return -EIO; 887 } 888 port->rx_buff_tab[i] = buff; 889 } 890 891 return 0; 892 } 893 894 static void destroy_queues(struct port *port) 895 { 896 int i; 897 898 if (port->desc_tab) { 899 for (i = 0; i < RX_DESCS; i++) { 900 struct desc *desc = rx_desc_ptr(port, i); 901 buffer_t *buff = port->rx_buff_tab[i]; 902 if (buff) { 903 dma_unmap_single(&port->netdev->dev, 904 desc->data, MAX_MRU, 905 DMA_FROM_DEVICE); 906 free_buffer(buff); 907 } 908 } 909 for (i = 0; i < TX_DESCS; i++) { 910 struct desc *desc = tx_desc_ptr(port, i); 911 buffer_t *buff = port->tx_buff_tab[i]; 912 if (buff) { 913 dma_unmap_tx(port, desc); 914 free_buffer(buff); 915 } 916 } 917 dma_pool_free(dma_pool, port->desc_tab, port->desc_tab_phys); 918 port->desc_tab = NULL; 919 } 920 921 if (!ports_open && dma_pool) { 922 dma_pool_destroy(dma_pool); 923 dma_pool = NULL; 924 } 925 } 926 927 static int eth_open(struct net_device *dev) 928 { 929 struct port *port = netdev_priv(dev); 930 struct npe *npe = port->npe; 931 struct msg msg; 932 int i, err; 933 934 if (!npe_running(npe)) { 935 err = npe_load_firmware(npe, npe_name(npe), &dev->dev); 936 if (err) 937 return err; 938 939 if (npe_recv_message(npe, &msg, "ETH_GET_STATUS")) { 940 printk(KERN_ERR "%s: %s not responding\n", dev->name, 941 npe_name(npe)); 942 return -EIO; 943 } 944 } 945 946 mdio_write(dev, port->plat->phy, MII_BMCR, port->mii_bmcr); 947 948 memset(&msg, 0, sizeof(msg)); 949 msg.cmd = NPE_VLAN_SETRXQOSENTRY; 950 msg.eth_id = port->id; 951 msg.byte5 = port->plat->rxq | 0x80; 952 msg.byte7 = port->plat->rxq << 4; 953 for (i = 0; i < 8; i++) { 954 msg.byte3 = i; 955 if (npe_send_recv_message(port->npe, &msg, "ETH_SET_RXQ")) 956 return -EIO; 957 } 958 959 msg.cmd = NPE_EDB_SETPORTADDRESS; 960 msg.eth_id = PHYSICAL_ID(port->id); 961 msg.byte2 = dev->dev_addr[0]; 962 msg.byte3 = dev->dev_addr[1]; 963 msg.byte4 = dev->dev_addr[2]; 964 msg.byte5 = dev->dev_addr[3]; 965 msg.byte6 = dev->dev_addr[4]; 966 msg.byte7 = dev->dev_addr[5]; 967 if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAC")) 968 return -EIO; 969 970 memset(&msg, 0, sizeof(msg)); 971 msg.cmd = NPE_FW_SETFIREWALLMODE; 972 msg.eth_id = port->id; 973 if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE")) 974 return -EIO; 975 976 if ((err = request_queues(port)) != 0) 977 return err; 978 979 if ((err = init_queues(port)) != 0) { 980 destroy_queues(port); 981 release_queues(port); 982 return err; 983 } 984 985 for (i = 0; i < ETH_ALEN; i++) 986 __raw_writel(dev->dev_addr[i], &port->regs->hw_addr[i]); 987 __raw_writel(0x08, &port->regs->random_seed); 988 __raw_writel(0x12, &port->regs->partial_empty_threshold); 989 __raw_writel(0x30, &port->regs->partial_full_threshold); 990 __raw_writel(0x08, &port->regs->tx_start_bytes); 991 __raw_writel(0x15, &port->regs->tx_deferral); 992 __raw_writel(0x08, &port->regs->tx_2part_deferral[0]); 993 __raw_writel(0x07, &port->regs->tx_2part_deferral[1]); 994 __raw_writel(0x80, &port->regs->slot_time); 995 __raw_writel(0x01, &port->regs->int_clock_threshold); 996 997 /* Populate queues with buffers, no failure after this point */ 998 for (i = 0; i < TX_DESCS; i++) 999 queue_put_desc(port->plat->txreadyq, 1000 tx_desc_phys(port, i), tx_desc_ptr(port, i)); 1001 1002 for (i = 0; i < RX_DESCS; i++) 1003 queue_put_desc(RXFREE_QUEUE(port->id), 1004 rx_desc_phys(port, i), rx_desc_ptr(port, i)); 1005 1006 __raw_writel(TX_CNTRL1_RETRIES, &port->regs->tx_control[1]); 1007 __raw_writel(DEFAULT_TX_CNTRL0, &port->regs->tx_control[0]); 1008 __raw_writel(0, &port->regs->rx_control[1]); 1009 __raw_writel(DEFAULT_RX_CNTRL0, &port->regs->rx_control[0]); 1010 1011 phy_check_media(port, 1); 1012 eth_set_mcast_list(dev); 1013 netif_start_queue(dev); 1014 schedule_delayed_work(&port->mdio_thread, MDIO_INTERVAL); 1015 1016 qmgr_set_irq(port->plat->rxq, QUEUE_IRQ_SRC_NOT_EMPTY, 1017 eth_rx_irq, dev); 1018 if (!ports_open) { 1019 qmgr_set_irq(TXDONE_QUEUE, QUEUE_IRQ_SRC_NOT_EMPTY, 1020 eth_txdone_irq, NULL); 1021 qmgr_enable_irq(TXDONE_QUEUE); 1022 } 1023 ports_open++; 1024 netif_rx_schedule(dev); /* we may already have RX data, enables IRQ */ 1025 return 0; 1026 } 1027 1028 static int eth_close(struct net_device *dev) 1029 { 1030 struct port *port = netdev_priv(dev); 1031 struct msg msg; 1032 int buffs = RX_DESCS; /* allocated RX buffers */ 1033 int i; 1034 1035 ports_open--; 1036 qmgr_disable_irq(port->plat->rxq); 1037 netif_stop_queue(dev); 1038 1039 while (queue_get_desc(RXFREE_QUEUE(port->id), port, 0) >= 0) 1040 buffs--; 1041 1042 memset(&msg, 0, sizeof(msg)); 1043 msg.cmd = NPE_SETLOOPBACK_MODE; 1044 msg.eth_id = port->id; 1045 msg.byte3 = 1; 1046 if (npe_send_recv_message(port->npe, &msg, "ETH_ENABLE_LOOPBACK")) 1047 printk(KERN_CRIT "%s: unable to enable loopback\n", dev->name); 1048 1049 i = 0; 1050 do { /* drain RX buffers */ 1051 while (queue_get_desc(port->plat->rxq, port, 0) >= 0) 1052 buffs--; 1053 if (!buffs) 1054 break; 1055 if (qmgr_stat_empty(TX_QUEUE(port->id))) { 1056 /* we have to inject some packet */ 1057 struct desc *desc; 1058 u32 phys; 1059 int n = queue_get_desc(port->plat->txreadyq, port, 1); 1060 BUG_ON(n < 0); 1061 desc = tx_desc_ptr(port, n); 1062 phys = tx_desc_phys(port, n); 1063 desc->buf_len = desc->pkt_len = 1; 1064 wmb(); 1065 queue_put_desc(TX_QUEUE(port->id), phys, desc); 1066 } 1067 udelay(1); 1068 } while (++i < MAX_CLOSE_WAIT); 1069 1070 if (buffs) 1071 printk(KERN_CRIT "%s: unable to drain RX queue, %i buffer(s)" 1072 " left in NPE\n", dev->name, buffs); 1073 #if DEBUG_CLOSE 1074 if (!buffs) 1075 printk(KERN_DEBUG "Draining RX queue took %i cycles\n", i); 1076 #endif 1077 1078 buffs = TX_DESCS; 1079 while (queue_get_desc(TX_QUEUE(port->id), port, 1) >= 0) 1080 buffs--; /* cancel TX */ 1081 1082 i = 0; 1083 do { 1084 while (queue_get_desc(port->plat->txreadyq, port, 1) >= 0) 1085 buffs--; 1086 if (!buffs) 1087 break; 1088 } while (++i < MAX_CLOSE_WAIT); 1089 1090 if (buffs) 1091 printk(KERN_CRIT "%s: unable to drain TX queue, %i buffer(s) " 1092 "left in NPE\n", dev->name, buffs); 1093 #if DEBUG_CLOSE 1094 if (!buffs) 1095 printk(KERN_DEBUG "Draining TX queues took %i cycles\n", i); 1096 #endif 1097 1098 msg.byte3 = 0; 1099 if (npe_send_recv_message(port->npe, &msg, "ETH_DISABLE_LOOPBACK")) 1100 printk(KERN_CRIT "%s: unable to disable loopback\n", 1101 dev->name); 1102 1103 port->mii_bmcr = mdio_read(dev, port->plat->phy, MII_BMCR) & 1104 ~(BMCR_RESET | BMCR_PDOWN); /* may have been altered */ 1105 mdio_write(dev, port->plat->phy, MII_BMCR, 1106 port->mii_bmcr | BMCR_PDOWN); 1107 1108 if (!ports_open) 1109 qmgr_disable_irq(TXDONE_QUEUE); 1110 cancel_rearming_delayed_work(&port->mdio_thread); 1111 destroy_queues(port); 1112 release_queues(port); 1113 return 0; 1114 } 1115 1116 static int __devinit eth_init_one(struct platform_device *pdev) 1117 { 1118 struct port *port; 1119 struct net_device *dev; 1120 struct eth_plat_info *plat = pdev->dev.platform_data; 1121 u32 regs_phys; 1122 int err; 1123 1124 if (!(dev = alloc_etherdev(sizeof(struct port)))) 1125 return -ENOMEM; 1126 1127 SET_MODULE_OWNER(dev); 1128 SET_NETDEV_DEV(dev, &pdev->dev); 1129 port = netdev_priv(dev); 1130 port->netdev = dev; 1131 port->id = pdev->id; 1132 1133 switch (port->id) { 1134 case IXP4XX_ETH_NPEA: 1135 port->regs = (struct eth_regs __iomem *)IXP4XX_EthA_BASE_VIRT; 1136 regs_phys = IXP4XX_EthA_BASE_PHYS; 1137 break; 1138 case IXP4XX_ETH_NPEB: 1139 port->regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT; 1140 regs_phys = IXP4XX_EthB_BASE_PHYS; 1141 break; 1142 case IXP4XX_ETH_NPEC: 1143 port->regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT; 1144 regs_phys = IXP4XX_EthC_BASE_PHYS; 1145 break; 1146 default: 1147 err = -ENOSYS; 1148 goto err_free; 1149 } 1150 1151 dev->open = eth_open; 1152 dev->hard_start_xmit = eth_xmit; 1153 dev->poll = eth_poll; 1154 dev->stop = eth_close; 1155 dev->get_stats = eth_stats; 1156 dev->do_ioctl = eth_ioctl; 1157 dev->set_multicast_list = eth_set_mcast_list; 1158 dev->weight = 16; 1159 dev->tx_queue_len = 100; 1160 1161 if (!(port->npe = npe_request(NPE_ID(port->id)))) { 1162 err = -EIO; 1163 goto err_free; 1164 } 1165 1166 if (register_netdev(dev)) { 1167 err = -EIO; 1168 goto err_npe_rel; 1169 } 1170 1171 port->mem_res = request_mem_region(regs_phys, REGS_SIZE, dev->name); 1172 if (!port->mem_res) { 1173 err = -EBUSY; 1174 goto err_unreg; 1175 } 1176 1177 port->plat = plat; 1178 npe_port_tab[NPE_ID(port->id)] = port; 1179 memcpy(dev->dev_addr, plat->hwaddr, ETH_ALEN); 1180 1181 platform_set_drvdata(pdev, dev); 1182 1183 __raw_writel(DEFAULT_CORE_CNTRL | CORE_RESET, 1184 &port->regs->core_control); 1185 udelay(50); 1186 __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); 1187 udelay(50); 1188 1189 port->mii.dev = dev; 1190 port->mii.mdio_read = mdio_read; 1191 port->mii.mdio_write = mdio_write; 1192 port->mii.phy_id = plat->phy; 1193 port->mii.phy_id_mask = 0x1F; 1194 port->mii.reg_num_mask = 0x1F; 1195 1196 printk(KERN_INFO "%s: MII PHY %i on %s\n", dev->name, plat->phy, 1197 npe_name(port->npe)); 1198 1199 phy_reset(dev, plat->phy); 1200 port->mii_bmcr = mdio_read(dev, plat->phy, MII_BMCR) & 1201 ~(BMCR_RESET | BMCR_PDOWN); 1202 mdio_write(dev, plat->phy, MII_BMCR, port->mii_bmcr | BMCR_PDOWN); 1203 1204 INIT_DELAYED_WORK(&port->mdio_thread, mdio_thread); 1205 return 0; 1206 1207 err_unreg: 1208 unregister_netdev(dev); 1209 err_npe_rel: 1210 npe_release(port->npe); 1211 err_free: 1212 free_netdev(dev); 1213 return err; 1214 } 1215 1216 static int __devexit eth_remove_one(struct platform_device *pdev) 1217 { 1218 struct net_device *dev = platform_get_drvdata(pdev); 1219 struct port *port = netdev_priv(dev); 1220 1221 unregister_netdev(dev); 1222 npe_port_tab[NPE_ID(port->id)] = NULL; 1223 platform_set_drvdata(pdev, NULL); 1224 npe_release(port->npe); 1225 release_resource(port->mem_res); 1226 free_netdev(dev); 1227 return 0; 1228 } 1229 1230 static struct platform_driver drv = { 1231 .driver.name = DRV_NAME, 1232 .probe = eth_init_one, 1233 .remove = eth_remove_one, 1234 }; 1235 1236 static int __init eth_init_module(void) 1237 { 1238 if (!(ixp4xx_read_fuses() & IXP4XX_FUSE_NPEB_ETH0)) 1239 return -ENOSYS; 1240 1241 /* All MII PHY accesses use NPE-B Ethernet registers */ 1242 spin_lock_init(&mdio_lock); 1243 mdio_regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT; 1244 __raw_writel(DEFAULT_CORE_CNTRL, &mdio_regs->core_control); 1245 1246 return platform_driver_register(&drv); 1247 } 1248 1249 static void __exit eth_cleanup_module(void) 1250 { 1251 platform_driver_unregister(&drv); 1252 } 1253 1254 MODULE_AUTHOR("Krzysztof Halasa"); 1255 MODULE_DESCRIPTION("Intel IXP4xx Ethernet driver"); 1256 MODULE_LICENSE("GPL v2"); 1257 module_init(eth_init_module); 1258 module_exit(eth_cleanup_module); -
a/drivers/net/wan/Kconfig
old new 334 334 335 335 Say Y if your card supports this feature. 336 336 337 config IXP4XX_HSS 338 tristate "IXP4xx HSS (synchronous serial port) support" 339 depends on HDLC && ARM && ARCH_IXP4XX 340 select IXP4XX_NPE 341 select IXP4XX_QMGR 342 help 343 Say Y here if you want to use built-in HSS ports 344 on IXP4xx processor. 345 337 346 config DLCI 338 347 tristate "Frame Relay DLCI support" 339 348 ---help--- -
a/drivers/net/wan/Makefile
old new 42 42 obj-$(CONFIG_WANXL) += wanxl.o 43 43 obj-$(CONFIG_PCI200SYN) += pci200syn.o 44 44 obj-$(CONFIG_PC300TOO) += pc300too.o 45 obj-$(CONFIG_IXP4XX_HSS) += ixp4xx_hss.o 45 46 46 47 clean-files := wanxlfw.inc 47 48 $(obj)/wanxl.o: $(obj)/wanxlfw.inc -
/dev/null
old new 1 /* 2 * Intel IXP4xx HSS (synchronous serial port) driver for Linux 3 * 4 * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of version 2 of the GNU General Public License 8 * as published by the Free Software Foundation. 9 */ 10 11 #include <linux/dma-mapping.h> 12 #include <linux/dmapool.h> 13 #include <linux/kernel.h> 14 #include <linux/hdlc.h> 15 #include <linux/platform_device.h> 16 #include <asm/io.h> 17 #include <asm/arch/npe.h> 18 #include <asm/arch/qmgr.h> 19 20 #define DEBUG_QUEUES 0 21 #define DEBUG_DESC 0 22 #define DEBUG_RX 0 23 #define DEBUG_TX 0 24 #define DEBUG_PKT_BYTES 0 25 #define DEBUG_CLOSE 0 26 27 #define DRV_NAME "ixp4xx_hss" 28 29 #define PKT_EXTRA_FLAGS 0 /* orig 1 */ 30 #define FRAME_SYNC_OFFSET 0 /* unused, channelized only */ 31 #define FRAME_SYNC_SIZE 1024 32 #define PKT_NUM_PIPES 1 /* 1, 2 or 4 */ 33 #define PKT_PIPE_FIFO_SIZEW 4 /* total 4 dwords per HSS */ 34 35 #define RX_DESCS 16 /* also length of all RX queues */ 36 #define TX_DESCS 16 /* also length of all TX queues */ 37 38 #define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS)) 39 #define RX_SIZE (HDLC_MAX_MRU + 4) /* NPE needs more space */ 40 #define MAX_CLOSE_WAIT 1000 /* microseconds */ 41 42 /* Queue IDs */ 43 #define HSS0_CHL_RXTRIG_QUEUE 12 /* orig size = 32 dwords */ 44 #define HSS0_PKT_RX_QUEUE 13 /* orig size = 32 dwords */ 45 #define HSS0_PKT_TX0_QUEUE 14 /* orig size = 16 dwords */ 46 #define HSS0_PKT_TX1_QUEUE 15 47 #define HSS0_PKT_TX2_QUEUE 16 48 #define HSS0_PKT_TX3_QUEUE 17 49 #define HSS0_PKT_RXFREE0_QUEUE 18 /* orig size = 16 dwords */ 50 #define HSS0_PKT_RXFREE1_QUEUE 19 51 #define HSS0_PKT_RXFREE2_QUEUE 20 52 #define HSS0_PKT_RXFREE3_QUEUE 21 53 #define HSS0_PKT_TXDONE_QUEUE 22 /* orig size = 64 dwords */ 54 55 #define HSS1_CHL_RXTRIG_QUEUE 10 56 #define HSS1_PKT_RX_QUEUE 0 57 #define HSS1_PKT_TX0_QUEUE 5 58 #define HSS1_PKT_TX1_QUEUE 6 59 #define HSS1_PKT_TX2_QUEUE 7 60 #define HSS1_PKT_TX3_QUEUE 8 61 #define HSS1_PKT_RXFREE0_QUEUE 1 62 #define HSS1_PKT_RXFREE1_QUEUE 2 63 #define HSS1_PKT_RXFREE2_QUEUE 3 64 #define HSS1_PKT_RXFREE3_QUEUE 4 65 #define HSS1_PKT_TXDONE_QUEUE 9 66 67 #define NPE_PKT_MODE_HDLC 0 68 #define NPE_PKT_MODE_RAW 1 69 #define NPE_PKT_MODE_56KMODE 2 70 #define NPE_PKT_MODE_56KENDIAN_MSB 4 71 72 /* PKT_PIPE_HDLC_CFG_WRITE flags */ 73 #define PKT_HDLC_IDLE_ONES 0x1 /* default = flags */ 74 #define PKT_HDLC_CRC_32 0x2 /* default = CRC-16 */ 75 #define PKT_HDLC_MSB_ENDIAN 0x4 /* default = LE */ 76 77 78 /* hss_config, PCRs */ 79 /* Frame sync sampling, default = active low */ 80 #define PCR_FRM_SYNC_ACTIVE_HIGH 0x40000000 81 #define PCR_FRM_SYNC_FALLINGEDGE 0x80000000 82 #define PCR_FRM_SYNC_RISINGEDGE 0xC0000000 83 84 /* Frame sync pin: input (default) or output generated off a given clk edge */ 85 #define PCR_FRM_SYNC_OUTPUT_FALLING 0x20000000 86 #define PCR_FRM_SYNC_OUTPUT_RISING 0x30000000 87 88 /* Frame and data clock sampling on edge, default = falling */ 89 #define PCR_FCLK_EDGE_RISING 0x08000000 90 #define PCR_DCLK_EDGE_RISING 0x04000000 91 92 /* Clock direction, default = input */ 93 #define PCR_SYNC_CLK_DIR_OUTPUT 0x02000000 94 95 /* Generate/Receive frame pulses, default = enabled */ 96 #define PCR_FRM_PULSE_DISABLED 0x01000000 97 98 /* Data rate is full (default) or half the configured clk speed */ 99 #define PCR_HALF_CLK_RATE 0x00200000 100 101 /* Invert data between NPE and HSS FIFOs? (default = no) */ 102 #define PCR_DATA_POLARITY_INVERT 0x00100000 103 104 /* TX/RX endianness, default = LSB */ 105 #define PCR_MSB_ENDIAN 0x00080000 106 107 /* Normal (default) / open drain mode (TX only) */ 108 #define PCR_TX_PINS_OPEN_DRAIN 0x00040000 109 110 /* No framing bit transmitted and expected on RX? (default = framing bit) */ 111 #define PCR_SOF_NO_FBIT 0x00020000 112 113 /* Drive data pins? */ 114 #define PCR_TX_DATA_ENABLE 0x00010000 115 116 /* Voice 56k type: drive the data pins low (default), high, high Z */ 117 #define PCR_TX_V56K_HIGH 0x00002000 118 #define PCR_TX_V56K_HIGH_IMP 0x00004000 119 120 /* Unassigned type: drive the data pins low (default), high, high Z */ 121 #define PCR_TX_UNASS_HIGH 0x00000800 122 #define PCR_TX_UNASS_HIGH_IMP 0x00001000 123 124 /* T1 @ 1.544MHz only: Fbit dictated in FIFO (default) or high Z */ 125 #define PCR_TX_FB_HIGH_IMP 0x00000400 126 127 /* 56k data endiannes - which bit unused: high (default) or low */ 128 #define PCR_TX_56KE_BIT_0_UNUSED 0x00000200 129 130 /* 56k data transmission type: 32/8 bit data (default) or 56K data */ 131 #define PCR_TX_56KS_56K_DATA 0x00000100 132 133 /* hss_config, cCR */ 134 /* Number of packetized clients, default = 1 */ 135 #define CCR_NPE_HFIFO_2_HDLC 0x04000000 136 #define CCR_NPE_HFIFO_3_OR_4HDLC 0x08000000 137 138 /* default = no loopback */ 139 #define CCR_LOOPBACK 0x02000000 140 141 /* HSS number, default = 0 (first) */ 142 #define CCR_SECOND_HSS 0x01000000 143 144 145 /* hss_config, clkCR: main:10, num:10, denom:12 */ 146 #define CLK42X_SPEED_EXP ((0x3FF << 22) | ( 2 << 12) | 15) /*65 KHz*/ 147 148 #define CLK42X_SPEED_512KHZ (( 130 << 22) | ( 2 << 12) | 15) 149 #define CLK42X_SPEED_1536KHZ (( 43 << 22) | ( 18 << 12) | 47) 150 #define CLK42X_SPEED_1544KHZ (( 43 << 22) | ( 33 << 12) | 192) 151 #define CLK42X_SPEED_2048KHZ (( 32 << 22) | ( 34 << 12) | 63) 152 #define CLK42X_SPEED_4096KHZ (( 16 << 22) | ( 34 << 12) | 127) 153 #define CLK42X_SPEED_8192KHZ (( 8 << 22) | ( 34 << 12) | 255) 154 155 #define CLK46X_SPEED_512KHZ (( 130 << 22) | ( 24 << 12) | 127) 156 #define CLK46X_SPEED_1536KHZ (( 43 << 22) | (152 << 12) | 383) 157 #define CLK46X_SPEED_1544KHZ (( 43 << 22) | ( 66 << 12) | 385) 158 #define CLK46X_SPEED_2048KHZ (( 32 << 22) | (280 << 12) | 511) 159 #define CLK46X_SPEED_4096KHZ (( 16 << 22) | (280 << 12) | 1023) 160 #define CLK46X_SPEED_8192KHZ (( 8 << 22) | (280 << 12) | 2047) 161 162 163 /* hss_config, LUTs: default = unassigned */ 164 #define TDMMAP_HDLC 1 /* HDLC - packetised */ 165 #define TDMMAP_VOICE56K 2 /* Voice56K - channelised */ 166 #define TDMMAP_VOICE64K 3 /* Voice64K - channelised */ 167 168 169 /* NPE command codes */ 170 /* writes the ConfigWord value to the location specified by offset */ 171 #define PORT_CONFIG_WRITE 0x40 172 173 /* triggers the NPE to load the contents of the configuration table */ 174 #define PORT_CONFIG_LOAD 0x41 175 176 /* triggers the NPE to return an HssErrorReadResponse message */ 177 #define PORT_ERROR_READ 0x42 178 179 /* reset NPE internal status and enable the HssChannelized operation */ 180 #define CHAN_FLOW_ENABLE 0x43 181 #define CHAN_FLOW_DISABLE 0x44 182 #define CHAN_IDLE_PATTERN_WRITE 0x45 183 #define CHAN_NUM_CHANS_WRITE 0x46 184 #define CHAN_RX_BUF_ADDR_WRITE 0x47 185 #define CHAN_RX_BUF_CFG_WRITE 0x48 186 #define CHAN_TX_BLK_CFG_WRITE 0x49 187 #define CHAN_TX_BUF_ADDR_WRITE 0x4A 188 #define CHAN_TX_BUF_SIZE_WRITE 0x4B 189 #define CHAN_TSLOTSWITCH_ENABLE 0x4C 190 #define CHAN_TSLOTSWITCH_DISABLE 0x4D 191 192 /* downloads the gainWord value for a timeslot switching channel associated 193 with bypassNum */ 194 #define CHAN_TSLOTSWITCH_GCT_DOWNLOAD 0x4E 195 196 /* triggers the NPE to reset internal status and enable the HssPacketized 197 operation for the flow specified by pPipe */ 198 #define PKT_PIPE_FLOW_ENABLE 0x50 199 #define PKT_PIPE_FLOW_DISABLE 0x51 200 #define PKT_NUM_PIPES_WRITE 0x52 201 #define PKT_PIPE_FIFO_SIZEW_WRITE 0x53 202 #define PKT_PIPE_HDLC_CFG_WRITE 0x54 203 #define PKT_PIPE_IDLE_PATTERN_WRITE 0x55 204 #define PKT_PIPE_RX_SIZE_WRITE 0x56 205 #define PKT_PIPE_MODE_WRITE 0x57 206 207 208 #define HSS_TIMESLOTS 128 209 #define HSS_LUT_BITS 2 210 211 /* HDLC packet status values - desc->status */ 212 #define ERR_SHUTDOWN 1 /* stop or shutdown occurrance */ 213 #define ERR_HDLC_ALIGN 2 /* HDLC alignment error */ 214 #define ERR_HDLC_FCS 3 /* HDLC Frame Check Sum error */ 215 #define ERR_RXFREE_Q_EMPTY 4 /* RX-free queue became empty while receiving 216 this packet (if buf_len < pkt_len) */ 217 #define ERR_HDLC_TOO_LONG 5 /* HDLC frame size too long */ 218 #define ERR_HDLC_ABORT 6 /* abort sequence received */ 219 #define ERR_DISCONNECTING 7 /* disconnect is in progress */ 220 221 222 #ifdef __ARMEB__ 223 typedef struct sk_buff buffer_t; 224 #define free_buffer dev_kfree_skb 225 #define free_buffer_irq dev_kfree_skb_irq 226 #else 227 typedef void buffer_t; 228 #define free_buffer kfree 229 #define free_buffer_irq kfree 230 #endif 231 232 struct port { 233 struct npe *npe; 234 struct net_device *netdev; 235 struct hss_plat_info *plat; 236 buffer_t *rx_buff_tab[RX_DESCS], *tx_buff_tab[TX_DESCS]; 237 struct desc *desc_tab; /* coherent */ 238 u32 desc_tab_phys; 239 sync_serial_settings settings; 240 int id; 241 u8 hdlc_cfg; 242 }; 243 244 /* NPE message structure */ 245 struct msg { 246 #ifdef __ARMEB__ 247 u8 cmd, unused, hss_port, index; 248 union { 249 struct { u8 data8a, data8b, data8c, data8d; }; 250 struct { u16 data16a, data16b; }; 251 struct { u32 data32; }; 252 }; 253 #else 254 u8 index, hss_port, unused, cmd; 255 union { 256 struct { u8 data8d, data8c, data8b, data8a; }; 257 struct { u16 data16b, data16a; }; 258 struct { u32 data32; }; 259 }; 260 #endif 261 }; 262 263 /* HDLC packet descriptor */ 264 struct desc { 265 u32 next; /* pointer to next buffer, unused */ 266 267 #ifdef __ARMEB__ 268 u16 buf_len; /* buffer length */ 269 u16 pkt_len; /* packet length */ 270 u32 data; /* pointer to data buffer in RAM */ 271 u8 status; 272 u8 error_count; 273 u16 __reserved; 274 #else 275 u16 pkt_len; /* packet length */ 276 u16 buf_len; /* buffer length */ 277 u32 data; /* pointer to data buffer in RAM */ 278 u16 __reserved; 279 u8 error_count; 280 u8 status; 281 #endif 282 u32 __reserved1[4]; 283 }; 284 285 286 #define rx_desc_phys(port, n) ((port)->desc_tab_phys + \ 287 (n) * sizeof(struct desc)) 288 #define rx_desc_ptr(port, n) (&(port)->desc_tab[n]) 289 290 #define tx_desc_phys(port, n) ((port)->desc_tab_phys + \ 291 ((n) + RX_DESCS) * sizeof(struct desc)) 292 #define tx_desc_ptr(port, n) (&(port)->desc_tab[(n) + RX_DESCS]) 293 294 #ifndef __ARMEB__ 295 static inline void memcpy_swab32(u32 *dest, u32 *src, int cnt) 296 { 297 int i; 298 for (i = 0; i < cnt; i++) 299 dest[i] = swab32(src[i]); 300 } 301 #endif 302 303 static int ports_open; 304 static struct dma_pool *dma_pool; 305 306 static struct { 307 int tx, txdone, rx, rxfree; 308 }queue_ids[2] = {{ HSS0_PKT_TX0_QUEUE, HSS0_PKT_TXDONE_QUEUE, 309 HSS0_PKT_RX_QUEUE, HSS0_PKT_RXFREE0_QUEUE }, 310 { HSS1_PKT_TX0_QUEUE, HSS1_PKT_TXDONE_QUEUE, 311 HSS1_PKT_RX_QUEUE, HSS1_PKT_RXFREE0_QUEUE }, 312 }; 313 314 315 static inline struct port* dev_to_port(struct net_device *dev) 316 { 317 return dev_to_hdlc(dev)->priv; 318 } 319 320 321 static inline void debug_pkt(struct net_device *dev, const char *func, 322 u8 *data, int len) 323 { 324 #if DEBUG_PKT_BYTES 325 int i; 326 327 printk(KERN_DEBUG "%s: %s(%i) ", dev->name, func, len); 328 for (i = 0; i < len; i++) { 329 if (i >= DEBUG_PKT_BYTES) 330 break; 331 printk("%s%02X", !(i % 4) ? " " : "", data[i]); 332 } 333 printk("\n"); 334 #endif 335 } 336 337 338 static inline void debug_desc(u32 phys, struct desc *desc) 339 { 340 #if DEBUG_DESC 341 printk(KERN_DEBUG "%X: %X %3X %3X %08X %X %X\n", 342 phys, desc->next, desc->buf_len, desc->pkt_len, 343 desc->data, desc->status, desc->error_count); 344 #endif 345 } 346 347 static inline void debug_queue(unsigned int queue, int is_get, u32 phys) 348 { 349 #if DEBUG_QUEUES 350 static struct { 351 int queue; 352 char *name; 353 } names[] = { 354 { HSS0_PKT_TX0_QUEUE, "TX#0 " }, 355 { HSS0_PKT_TXDONE_QUEUE, "TX-done#0 " }, 356 { HSS0_PKT_RX_QUEUE, "RX#0 " }, 357 { HSS0_PKT_RXFREE0_QUEUE, "RX-free#0 " }, 358 { HSS1_PKT_TX0_QUEUE, "TX#1 " }, 359 { HSS1_PKT_TXDONE_QUEUE, "TX-done#1 " }, 360 { HSS1_PKT_RX_QUEUE, "RX#1 " }, 361 { HSS1_PKT_RXFREE0_QUEUE, "RX-free#1 " }, 362 }; 363 int i; 364 365 for (i = 0; i < ARRAY_SIZE(names); i++) 366 if (names[i].queue == queue) 367 break; 368 369 printk(KERN_DEBUG "Queue %i %s%s %X\n", queue, 370 i < ARRAY_SIZE(names) ? names[i].name : "", 371 is_get ? "->" : "<-", phys); 372 #endif 373 } 374 375 static inline u32 queue_get_entry(unsigned int queue) 376 { 377 u32 phys = qmgr_get_entry(queue); 378 debug_queue(queue, 1, phys); 379 return phys; 380 } 381 382 static inline int queue_get_desc(unsigned int queue, struct port *port, 383 int is_tx) 384 { 385 u32 phys, tab_phys, n_desc; 386 struct desc *tab; 387 388 if (!(phys = queue_get_entry(queue))) 389 return -1; 390 391 BUG_ON(phys & 0x1F); 392 tab_phys = is_tx ? tx_desc_phys(port, 0) : rx_desc_phys(port, 0); 393 tab = is_tx ? tx_desc_ptr(port, 0) : rx_desc_ptr(port, 0); 394 n_desc = (phys - tab_phys) / sizeof(struct desc); 395 BUG_ON(n_desc >= (is_tx ? TX_DESCS : RX_DESCS)); 396 debug_desc(phys, &tab[n_desc]); 397 BUG_ON(tab[n_desc].next); 398 return n_desc; 399 } 400 401 static inline void queue_put_desc(unsigned int queue, u32 phys, 402 struct desc *desc) 403 { 404 debug_queue(queue, 0, phys); 405 debug_desc(phys, desc); 406 BUG_ON(phys & 0x1F); 407 qmgr_put_entry(queue, phys); 408 BUG_ON(qmgr_stat_overflow(queue)); 409 } 410 411 412 static inline void dma_unmap_tx(struct port *port, struct desc *desc) 413 { 414 #ifdef __ARMEB__ 415 dma_unmap_single(&port->netdev->dev, desc->data, 416 desc->buf_len, DMA_TO_DEVICE); 417 #else 418 dma_unmap_single(&port->netdev->dev, desc->data & ~3, 419 ALIGN((desc->data & 3) + desc->buf_len, 4), 420 DMA_TO_DEVICE); 421 #endif 422 } 423 424 425 static void hss_set_carrier(void *pdev, int carrier) 426 { 427 struct net_device *dev = pdev; 428 if (carrier) 429 netif_carrier_on(dev); 430 else 431 netif_carrier_off(dev); 432 } 433 434 static void hss_rx_irq(void *pdev) 435 { 436 struct net_device *dev = pdev; 437 struct port *port = dev_to_port(dev); 438 439 #if DEBUG_RX 440 printk(KERN_DEBUG "%s: hss_rx_irq\n", dev->name); 441 #endif 442 qmgr_disable_irq(queue_ids[port->id].rx); 443 netif_rx_schedule(dev); 444 } 445 446 static int hss_poll(struct net_device *dev, int *budget) 447 { 448 struct port *port = dev_to_port(dev); 449 unsigned int rxq = queue_ids[port->id].rx; 450 unsigned int rxfreeq = queue_ids[port->id].rxfree; 451 struct net_device_stats *stats = hdlc_stats(dev); 452 int quota = dev->quota, received = 0; 453 454 #if DEBUG_RX 455 printk(KERN_DEBUG "%s: hss_poll\n", dev->name); 456 #endif 457 458 while (quota) { 459 struct sk_buff *skb; 460 struct desc *desc; 461 int n; 462 #ifdef __ARMEB__ 463 struct sk_buff *temp; 464 u32 phys; 465 #endif 466 467 if ((n = queue_get_desc(rxq, port, 0)) < 0) { 468 dev->quota -= received; /* No packet received */ 469 *budget -= received; 470 received = 0; 471 #if DEBUG_RX 472 printk(KERN_DEBUG "%s: hss_poll netif_rx_complete\n", 473 dev->name); 474 #endif 475 netif_rx_complete(dev); 476 qmgr_enable_irq(rxq); 477 if (!qmgr_stat_empty(rxq) && 478 netif_rx_reschedule(dev, 0)) { 479 #if DEBUG_RX 480 printk(KERN_DEBUG "%s: hss_poll" 481 " netif_rx_reschedule successed\n", 482 dev->name); 483 #endif 484 qmgr_disable_irq(rxq); 485 continue; 486 } 487 #if DEBUG_RX 488 printk(KERN_DEBUG "%s: hss_poll all done\n", 489 dev->name); 490 #endif 491 return 0; /* all work done */ 492 } 493 494 desc = rx_desc_ptr(port, n); 495 496 if (desc->error_count) /* FIXME - remove printk */ 497 printk(KERN_DEBUG "%s: hss_poll status 0x%02X errors" 498 " %u\n", dev->name, desc->status, 499 desc->error_count); 500 501 skb = NULL; 502 switch (desc->status) { 503 case 0: 504 #ifdef __ARMEB__ 505 if ((skb = netdev_alloc_skb(dev, RX_SIZE)) != NULL) { 506 phys = dma_map_single(&dev->dev, skb->data, 507 RX_SIZE, 508 DMA_FROM_DEVICE); 509 if (dma_mapping_error(phys)) { 510 dev_kfree_skb(skb); 511 skb = NULL; 512 } 513 } 514 #else 515 skb = netdev_alloc_skb(dev, desc->pkt_len); 516 #endif 517 if (!skb) 518 stats->rx_dropped++; 519 break; 520 case ERR_HDLC_ALIGN: 521 case ERR_HDLC_ABORT: 522 stats->rx_frame_errors++; 523 stats->rx_errors++; 524 break; 525 case ERR_HDLC_FCS: 526 stats->rx_crc_errors++; 527 stats->rx_errors++; 528 break; 529 case ERR_HDLC_TOO_LONG: 530 stats->rx_length_errors++; 531 stats->rx_errors++; 532 break; 533 default: /* FIXME - remove printk */ 534 printk(KERN_ERR "%s: hss_poll(): status 0x%02X errors" 535 " %u\n", dev->name, desc->status, 536 desc->error_count); 537 stats->rx_errors++; 538 } 539 540 if (!skb) { 541 /* put the desc back on RX-ready queue */ 542 desc->buf_len = RX_SIZE; 543 desc->pkt_len = desc->status = 0; 544 queue_put_desc(rxfreeq, rx_desc_phys(port, n), desc); 545 continue; 546 } 547 548 /* process received frame */ 549 #ifdef __ARMEB__ 550 temp = skb; 551 skb = port->rx_buff_tab[n]; 552 dma_unmap_single(&dev->dev, desc->data, 553 RX_SIZE, DMA_FROM_DEVICE); 554 #else 555 dma_sync_single(&dev->dev, desc->data, 556 RX_SIZE, DMA_FROM_DEVICE); 557 memcpy_swab32((u32 *)skb->data, (u32 *)port->rx_buff_tab[n], 558 ALIGN(desc->pkt_len, 4) / 4); 559 #endif 560 skb_put(skb, desc->pkt_len); 561 562 debug_pkt(dev, "hss_poll", skb->data, skb->len); 563 564 skb->protocol = hdlc_type_trans(skb, dev); 565 dev->last_rx = jiffies; 566 stats->rx_packets++; 567 stats->rx_bytes += skb->len; 568 netif_receive_skb(skb); 569 570 /* put the new buffer on RX-free queue */ 571 #ifdef __ARMEB__ 572 port->rx_buff_tab[n] = temp; 573 desc->data = phys; 574 #endif 575 desc->buf_len = RX_SIZE; 576 desc->pkt_len = 0; 577 queue_put_desc(rxfreeq, rx_desc_phys(port, n), desc); 578 quota--; 579 received++; 580 } 581 dev->quota -= received; 582 *budget -= received; 583 #if DEBUG_RX 584 printk(KERN_DEBUG "hss_poll(): end, not all work done\n"); 585 #endif 586 return 1; /* not all work done */ 587 } 588 589 590 static void hss_txdone_irq(void *pdev) 591 { 592 struct net_device *dev = pdev; 593 struct port *port = dev_to_port(dev); 594 struct net_device_stats *stats = hdlc_stats(dev); 595 int n_desc; 596 597 #if DEBUG_TX 598 printk(KERN_DEBUG DRV_NAME ": hss_txdone_irq\n"); 599 #endif 600 while ((n_desc = queue_get_desc(queue_ids[port->id].txdone, 601 port, 1)) >= 0) { 602 struct desc *desc; 603 int start; 604 605 desc = tx_desc_ptr(port, n_desc); 606 607 stats->tx_packets++; 608 stats->tx_bytes += desc->pkt_len; 609 610 dma_unmap_tx(port, desc); 611 #if DEBUG_TX 612 printk(KERN_DEBUG "%s: hss_txdone_irq free %p\n", 613 port->netdev->name, port->tx_buff_tab[n_desc]); 614 #endif 615 free_buffer_irq(port->tx_buff_tab[n_desc]); 616 port->tx_buff_tab[n_desc] = NULL; 617 618 start = qmgr_stat_empty(port->plat->txreadyq); 619 queue_put_desc(port->plat->txreadyq, 620 tx_desc_phys(port, n_desc), desc); 621 if (start) { 622 #if DEBUG_TX 623 printk(KERN_DEBUG "%s: hss_txdone_irq xmit ready\n", 624 port->netdev->name); 625 #endif 626 netif_wake_queue(port->netdev); 627 } 628 } 629 } 630 631 static int hss_xmit(struct sk_buff *skb, struct net_device *dev) 632 { 633 struct port *port = dev_to_port(dev); 634 struct net_device_stats *stats = hdlc_stats(dev); 635 unsigned int txreadyq = port->plat->txreadyq; 636 int len, offset, bytes, n; 637 void *mem; 638 u32 phys; 639 struct desc *desc; 640 641 #if DEBUG_TX 642 printk(KERN_DEBUG "%s: hss_xmit\n", dev->name); 643 #endif 644 645 if (unlikely(skb->len > HDLC_MAX_MRU)) { 646 dev_kfree_skb(skb); 647 stats->tx_errors++; 648 return NETDEV_TX_OK; 649 } 650 651 debug_pkt(dev, "hss_xmit", skb->data, skb->len); 652 653 len = skb->len; 654 #ifdef __ARMEB__ 655 offset = 0; /* no need to keep alignment */ 656 bytes = len; 657 mem = skb->data; 658 #else 659 offset = (int)skb->data & 3; /* keep 32-bit alignment */ 660 bytes = ALIGN(offset + len, 4); 661 if (!(mem = kmalloc(bytes, GFP_ATOMIC))) { 662 dev_kfree_skb(skb); 663 stats->tx_dropped++; 664 return NETDEV_TX_OK; 665 } 666 memcpy_swab32(mem, (u32 *)((int)skb->data & ~3), bytes / 4); 667 dev_kfree_skb(skb); 668 #endif 669 670 phys = dma_map_single(&dev->dev, mem, bytes, DMA_TO_DEVICE); 671 if (dma_mapping_error(phys)) { 672 #ifdef __ARMEB__ 673 dev_kfree_skb(skb); 674 #else 675 kfree(mem); 676 #endif 677 stats->tx_dropped++; 678 return NETDEV_TX_OK; 679 } 680 681 n = queue_get_desc(txreadyq, port, 1); 682 BUG_ON(n < 0); 683 desc = tx_desc_ptr(port, n); 684 685 #ifdef __ARMEB__ 686 port->tx_buff_tab[n] = skb; 687 #else 688 port->tx_buff_tab[n] = mem; 689 #endif 690 desc->data = phys + offset; 691 desc->buf_len = desc->pkt_len = len; 692 693 wmb(); 694 queue_put_desc(queue_ids[port->id].tx, tx_desc_phys(port, n), desc); 695 dev->trans_start = jiffies; 696 697 if (qmgr_stat_empty(txreadyq)) { 698 #if DEBUG_TX 699 printk(KERN_DEBUG "%s: hss_xmit queue full\n", dev->name); 700 #endif 701 netif_stop_queue(dev); 702 /* we could miss TX ready interrupt */ 703 if (!qmgr_stat_empty(txreadyq)) { 704 #if DEBUG_TX 705 printk(KERN_DEBUG "%s: hss_xmit ready again\n", 706 dev->name); 707 #endif 708 netif_wake_queue(dev); 709 } 710 } 711 712 #if DEBUG_TX 713 printk(KERN_DEBUG "%s: hss_xmit end\n", dev->name); 714 #endif 715 return NETDEV_TX_OK; 716 } 717 718 719 static int request_queues(struct port *port) 720 { 721 int err; 722 723 err = qmgr_request_queue(queue_ids[port->id].rxfree, RX_DESCS, 0, 0); 724 if (err) 725 return err; 726 727 err = qmgr_request_queue(queue_ids[port->id].rx, RX_DESCS, 0, 0); 728 if (err) 729 goto rel_rxfree; 730 731 err = qmgr_request_queue(queue_ids[port->id].tx, TX_DESCS, 0, 0); 732 if (err) 733 goto rel_rx; 734 735 err = qmgr_request_queue(port->plat->txreadyq, TX_DESCS, 0, 0); 736 if (err) 737 goto rel_tx; 738 739 err = qmgr_request_queue(queue_ids[port->id].txdone, TX_DESCS, 0, 0); 740 if (err) 741 goto rel_txready; 742 return 0; 743 744 rel_txready: 745 qmgr_release_queue(port->plat->txreadyq); 746 rel_tx: 747 qmgr_release_queue(queue_ids[port->id].tx); 748 rel_rx: 749 qmgr_release_queue(queue_ids[port->id].rx); 750 rel_rxfree: 751 qmgr_release_queue(queue_ids[port->id].rxfree); 752 printk(KERN_DEBUG "%s: unable to request hardware queues\n", 753 port->netdev->name); 754 return err; 755 } 756 757 static void release_queues(struct port *port) 758 { 759 qmgr_release_queue(queue_ids[port->id].rxfree); 760 qmgr_release_queue(queue_ids[port->id].rx); 761 qmgr_release_queue(queue_ids[port->id].txdone); 762 qmgr_release_queue(queue_ids[port->id].tx); 763 qmgr_release_queue(port->plat->txreadyq); 764 } 765 766 static int init_queues(struct port *port) 767 { 768 int i; 769 770 if (!ports_open) 771 if (!(dma_pool = dma_pool_create(DRV_NAME, NULL, 772 POOL_ALLOC_SIZE, 32, 0))) 773 return -ENOMEM; 774 775 if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, 776 &port->desc_tab_phys))) 777 return -ENOMEM; 778 memset(port->desc_tab, 0, POOL_ALLOC_SIZE); 779 memset(port->rx_buff_tab, 0, sizeof(port->rx_buff_tab)); /* tables */ 780 memset(port->tx_buff_tab, 0, sizeof(port->tx_buff_tab)); 781 782 /* Setup RX buffers */ 783 for (i = 0; i < RX_DESCS; i++) { 784 struct desc *desc = rx_desc_ptr(port, i); 785 buffer_t *buff; 786 void *data; 787 #ifdef __ARMEB__ 788 if (!(buff = netdev_alloc_skb(port->netdev, RX_SIZE))) 789 return -ENOMEM; 790 data = buff->data; 791 #else 792 if (!(buff = kmalloc(RX_SIZE, GFP_KERNEL))) 793 return -ENOMEM; 794 data = buff; 795 #endif 796 desc->buf_len = RX_SIZE; 797 desc->data = dma_map_single(&port->netdev->dev, data, 798 RX_SIZE, DMA_FROM_DEVICE); 799 if (dma_mapping_error(desc->data)) { 800 free_buffer(buff); 801 return -EIO; 802 } 803 port->rx_buff_tab[i] = buff; 804 } 805 806 return 0; 807 } 808 809 static void destroy_queues(struct port *port) 810 { 811 int i; 812 813 if (port->desc_tab) { 814 for (i = 0; i < RX_DESCS; i++) { 815 struct desc *desc = rx_desc_ptr(port, i); 816 buffer_t *buff = port->rx_buff_tab[i]; 817 if (buff) { 818 dma_unmap_single(&port->netdev->dev, 819 desc->data, RX_SIZE, 820 DMA_FROM_DEVICE); 821 free_buffer(buff); 822 } 823 } 824 for (i = 0; i < TX_DESCS; i++) { 825 struct desc *desc = tx_desc_ptr(port, i); 826 buffer_t *buff = port->tx_buff_tab[i]; 827 if (buff) { 828 dma_unmap_tx(port, desc); 829 free_buffer(buff); 830 } 831 } 832 dma_pool_free(dma_pool, port->desc_tab, port->desc_tab_phys); 833 port->desc_tab = NULL; 834 } 835 836 if (!ports_open && dma_pool) { 837 dma_pool_destroy(dma_pool); 838 dma_pool = NULL; 839 } 840 } 841 842 static int hss_open(struct net_device *dev) 843 { 844 struct port *port = dev_to_port(dev); 845 struct npe *npe = port->npe; 846 struct msg msg; 847 int i, err; 848 849 if (!npe_running(npe)) { 850 err = npe_load_firmware(npe, npe_name(npe), &dev->dev); 851 if (err) 852 return err; 853 } 854 855 if ((err = hdlc_open(dev)) != 0) 856 return err; 857 858 if (port->plat->open) 859 if ((err = port->plat->open(port->id, port->netdev, 860 hss_set_carrier)) != 0) 861 goto err_hdlc_close; 862 863 /* HSS main configuration */ 864 memset(&msg, 0, sizeof(msg)); 865 msg.cmd = PORT_CONFIG_WRITE; 866 msg.hss_port = port->id; 867 msg.index = 0; /* offset in HSS config */ 868 869 msg.data32 = PCR_FRM_PULSE_DISABLED | 870 PCR_SOF_NO_FBIT | 871 PCR_MSB_ENDIAN | 872 PCR_TX_DATA_ENABLE; 873 874 if (port->settings.clock_type == CLOCK_INT) 875 msg.data32 |= PCR_SYNC_CLK_DIR_OUTPUT; 876 877 if ((err = npe_send_message(npe, &msg, "HSS_SET_TX_PCR") != 0)) 878 goto err_plat_close; /* 0: TX PCR */ 879 880 msg.index = 4; 881 msg.data32 ^= PCR_TX_DATA_ENABLE | PCR_DCLK_EDGE_RISING; 882 if ((err = npe_send_message(npe, &msg, "HSS_SET_RX_PCR") != 0)) 883 goto err_plat_close; /* 4: RX PCR */ 884 885 msg.index = 8; 886 msg.data32 = (port->settings.loopback ? CCR_LOOPBACK : 0) | 887 (port->id ? CCR_SECOND_HSS : 0); 888 if ((err = npe_send_message(npe, &msg, "HSS_SET_CORE_CR") != 0)) 889 goto err_plat_close; /* 8: Core CR */ 890 891 msg.index = 12; 892 msg.data32 = CLK42X_SPEED_2048KHZ /* FIXME */; 893 if ((err = npe_send_message(npe, &msg, "HSS_SET_CLK_CR") != 0)) 894 goto err_plat_close; /* 12: CLK CR */ 895 896 msg.data32 = (FRAME_SYNC_OFFSET << 16) | (FRAME_SYNC_SIZE - 1); 897 msg.index = 16; 898 if ((err = npe_send_message(npe, &msg, "HSS_SET_TX_FCR") != 0)) 899 goto err_plat_close; /* 16: TX FCR */ 900 901 msg.index = 20; 902 if ((err = npe_send_message(npe, &msg, "HSS_SET_RX_FCR") != 0)) 903 goto err_plat_close; /* 20: RX FCR */ 904 905 msg.data32 = 0; /* Fill LUT with HDLC timeslots */ 906 for (i = 0; i < 32 / HSS_LUT_BITS; i++) 907 msg.data32 |= TDMMAP_HDLC << (HSS_LUT_BITS * i); 908 909 for (i = 0; i < 2 /* TX and RX */ * HSS_TIMESLOTS * HSS_LUT_BITS / 8; 910 i += 4) { 911 msg.index = 24 + i; /* 24 - 55: TX LUT, 56 - 87: RX LUT */ 912 if ((err = npe_send_message(npe, &msg, "HSS_SET_LUT") != 0)) 913 goto err_plat_close; 914 } 915 916 /* HDLC mode configuration */ 917 memset(&msg, 0, sizeof(msg)); 918 msg.cmd = PKT_NUM_PIPES_WRITE; 919 msg.hss_port = port->id; 920 msg.data8a = PKT_NUM_PIPES; 921 if ((err = npe_send_message(npe, &msg, "HSS_SET_PKT_PIPES") != 0)) 922 goto err_plat_close; 923 924 memset(&msg, 0, sizeof(msg)); 925 msg.cmd = PKT_PIPE_FIFO_SIZEW_WRITE; 926 msg.hss_port = port->id; 927 msg.data8a = PKT_PIPE_FIFO_SIZEW; 928 if ((err = npe_send_message(npe, &msg, "HSS_SET_PKT_FIFO") != 0)) 929 goto err_plat_close; 930 931 memset(&msg, 0, sizeof(msg)); 932 msg.cmd = PKT_PIPE_IDLE_PATTERN_WRITE; 933 msg.hss_port = port->id; 934 msg.data32 = 0x7F7F7F7F; 935 if ((err = npe_send_message(npe, &msg, "HSS_SET_PKT_IDLE") != 0)) 936 goto err_plat_close; 937 938 memset(&msg, 0, sizeof(msg)); 939 msg.cmd = PORT_CONFIG_LOAD; 940 msg.hss_port = port->id; 941 if ((err = npe_send_message(npe, &msg, "HSS_LOAD_CONFIG") != 0)) 942 goto err_plat_close; 943 if ((err = npe_recv_message(npe, &msg, "HSS_LOAD_CONFIG") != 0)) 944 goto err_plat_close; 945 946 /* HSS_LOAD_CONFIG for port #1 returns port_id = #4 */ 947 if (msg.cmd != PORT_CONFIG_LOAD || msg.data32) { 948 printk(KERN_DEBUG "%s: unexpected message received in" 949 " response to HSS_LOAD_CONFIG\n", npe_name(npe)); 950 err = EIO; 951 goto err_plat_close; 952 } 953 954 memset(&msg, 0, sizeof(msg)); 955 msg.cmd = PKT_PIPE_HDLC_CFG_WRITE; 956 msg.hss_port = port->id; 957 msg.data8a = port->hdlc_cfg; /* rx_cfg */ 958 msg.data8b = port->hdlc_cfg | (PKT_EXTRA_FLAGS << 3); /* tx_cfg */ 959 if ((err = npe_send_message(npe, &msg, "HSS_SET_HDLC_CFG") != 0)) 960 goto err_plat_close; 961 962 memset(&msg, 0, sizeof(msg)); 963 msg.cmd = PKT_PIPE_MODE_WRITE; 964 msg.hss_port = port->id; 965 msg.data8a = NPE_PKT_MODE_HDLC; 966 /* msg.data8b = inv_mask */ 967 /* msg.data8c = or_mask */ 968 if ((err = npe_send_message(npe, &msg, "HSS_SET_PKT_MODE") != 0)) 969 goto err_plat_close; 970 971 memset(&msg, 0, sizeof(msg)); 972 msg.cmd = PKT_PIPE_RX_SIZE_WRITE; 973 msg.hss_port = port->id; 974 msg.data16a = HDLC_MAX_MRU; 975 if ((err = npe_send_message(npe, &msg, "HSS_SET_PKT_RX_SIZE") != 0)) 976 goto err_plat_close; 977 978 if ((err = request_queues(port)) != 0) 979 goto err_plat_close; 980 981 if ((err = init_queues(port)) != 0) 982 goto err_destroy_queues; 983 984 memset(&msg, 0, sizeof(msg)); 985 msg.cmd = PKT_PIPE_FLOW_ENABLE; 986 msg.hss_port = port->id; 987 if ((err = npe_send_message(npe, &msg, "HSS_ENABLE_PKT_PIPE") != 0)) 988 goto err_destroy_queues; 989 990 /* Populate queues with buffers, no failure after this point */ 991 for (i = 0; i < TX_DESCS; i++) 992 queue_put_desc(port->plat->txreadyq, 993 tx_desc_phys(port, i), tx_desc_ptr(port, i)); 994 995 for (i = 0; i < RX_DESCS; i++) 996 queue_put_desc(queue_ids[port->id].rxfree, 997 rx_desc_phys(port, i), rx_desc_ptr(port, i)); 998 999 netif_start_queue(dev); 1000 1001 qmgr_set_irq(queue_ids[port->id].rx, QUEUE_IRQ_SRC_NOT_EMPTY, 1002 hss_rx_irq, dev); 1003 1004 qmgr_set_irq(queue_ids[port->id].txdone, QUEUE_IRQ_SRC_NOT_EMPTY, 1005 hss_txdone_irq, dev); 1006 qmgr_enable_irq(queue_ids[port->id].txdone); 1007 1008 ports_open++; 1009 netif_rx_schedule(dev); /* we may already have RX data, enables IRQ */ 1010 return 0; 1011 1012 err_destroy_queues: 1013 destroy_queues(port); 1014 release_queues(port); 1015 err_plat_close: 1016 if (port->plat->close) 1017 port->plat->close(port->id, port->netdev); 1018 err_hdlc_close: 1019 hdlc_close(dev); 1020 return err; 1021 } 1022 1023 static int hss_close(struct net_device *dev) 1024 { 1025 struct port *port = dev_to_port(dev); 1026 struct npe *npe = port->npe; 1027 struct msg msg; 1028 int buffs = RX_DESCS; /* allocated RX buffers */ 1029 int i; 1030 1031 ports_open--; 1032 qmgr_disable_irq(queue_ids[port->id].rx); 1033 netif_stop_queue(dev); 1034 1035 memset(&msg, 0, sizeof(msg)); 1036 msg.cmd = PKT_PIPE_FLOW_DISABLE; 1037 msg.hss_port = port->id; 1038 if (npe_send_message(npe, &msg, "HSS_DISABLE_PKT_PIPE")) { 1039 printk(KERN_CRIT "HSS-%i: unable to stop HDLC flow\n", 1040 port->id); 1041 /* The upper level would ignore the error anyway */ 1042 } 1043 1044 while (queue_get_desc(queue_ids[port->id].rxfree, port, 0) >= 0) 1045 buffs--; 1046 while (queue_get_desc(queue_ids[port->id].rx, port, 0) >= 0) 1047 buffs--; 1048 1049 if (buffs) 1050 printk(KERN_CRIT "%s: unable to drain RX queue, %i buffer(s)" 1051 " left in NPE\n", dev->name, buffs); 1052 1053 buffs = TX_DESCS; 1054 while (queue_get_desc(queue_ids[port->id].tx, port, 1) >= 0) 1055 buffs--; /* cancel TX */ 1056 1057 i = 0; 1058 do { 1059 while (queue_get_desc(port->plat->txreadyq, port, 1) >= 0) 1060 buffs--; 1061 if (!buffs) 1062 break; 1063 } while (++i < MAX_CLOSE_WAIT); 1064 1065 if (buffs) 1066 printk(KERN_CRIT "%s: unable to drain TX queue, %i buffer(s) " 1067 "left in NPE\n", dev->name, buffs); 1068 #if DEBUG_CLOSE 1069 if (!buffs) 1070 printk(KERN_DEBUG "Draining TX queues took %i cycles\n", i); 1071 #endif 1072 qmgr_disable_irq(queue_ids[port->id].txdone); 1073 destroy_queues(port); 1074 release_queues(port); 1075 1076 if (port->plat->close) 1077 port->plat->close(port->id, port->netdev); 1078 hdlc_close(dev); 1079 return 0; 1080 } 1081 1082 1083 static int hss_attach(struct net_device *dev, unsigned short encoding, 1084 unsigned short parity) 1085 { 1086 struct port *port = dev_to_port(dev); 1087 1088 if (encoding != ENCODING_NRZ) 1089 return -EINVAL; 1090 1091 switch(parity) { 1092 case PARITY_CRC16_PR1_CCITT: 1093 port->hdlc_cfg = 0; 1094 return 0; 1095 1096 case PARITY_CRC32_PR1_CCITT: 1097 port->hdlc_cfg = PKT_HDLC_CRC_32; 1098 return 0; 1099 1100 default: 1101 return -EINVAL; 1102 } 1103 } 1104 1105 1106 static int hss_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 1107 { 1108 const size_t size = sizeof(sync_serial_settings); 1109 sync_serial_settings new_line; 1110 int clk; 1111 sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync; 1112 struct port *port = dev_to_port(dev); 1113 1114 if (cmd != SIOCWANDEV) 1115 return hdlc_ioctl(dev, ifr, cmd); 1116 1117 switch(ifr->ifr_settings.type) { 1118 case IF_GET_IFACE: 1119 ifr->ifr_settings.type = IF_IFACE_V35; 1120 if (ifr->ifr_settings.size < size) { 1121 ifr->ifr_settings.size = size; /* data size wanted */ 1122 return -ENOBUFS; 1123 } 1124 if (copy_to_user(line, &port->settings, size)) 1125 return -EFAULT; 1126 return 0; 1127 1128 case IF_IFACE_SYNC_SERIAL: 1129 case IF_IFACE_V35: 1130 if(!capable(CAP_NET_ADMIN)) 1131 return -EPERM; 1132 if (dev->flags & IFF_UP) 1133 return -EBUSY; /* Cannot change parameters when open */ 1134 1135 if (copy_from_user(&new_line, line, size)) 1136 return -EFAULT; 1137 1138 clk = new_line.clock_type; 1139 if (port->plat->set_clock) 1140 clk = port->plat->set_clock(port->id, clk); 1141 1142 if (clk != CLOCK_EXT && clk != CLOCK_INT) 1143 return -EINVAL; /* No such clock setting */ 1144 1145 if (new_line.loopback != 0 && new_line.loopback != 1) 1146 return -EINVAL; 1147 1148 memcpy(&port->settings, &new_line, size); /* Update settings */ 1149 return 0; 1150 1151 default: 1152 return hdlc_ioctl(dev, ifr, cmd); 1153 } 1154 } 1155 1156 1157 static int __devinit hss_init_one(struct platform_device *pdev) 1158 { 1159 struct port *port; 1160 struct net_device *dev; 1161 hdlc_device *hdlc; 1162 int err; 1163 1164 if ((port = kzalloc(sizeof(*port), GFP_KERNEL)) == NULL) 1165 return -ENOMEM; 1166 platform_set_drvdata(pdev, port); 1167 port->id = pdev->id; 1168 1169 if ((port->npe = npe_request(0)) == NULL) { 1170 err = -ENOSYS; 1171 goto err_free; 1172 } 1173 1174 port->plat = pdev->dev.platform_data; 1175 if ((port->netdev = dev = alloc_hdlcdev(port)) == NULL) { 1176 err = -ENOMEM; 1177 goto err_plat; 1178 } 1179 1180 SET_MODULE_OWNER(net); 1181 SET_NETDEV_DEV(dev, &pdev->dev); 1182 hdlc = dev_to_hdlc(dev); 1183 hdlc->attach = hss_attach; 1184 hdlc->xmit = hss_xmit; 1185 dev->open = hss_open; 1186 dev->poll = hss_poll; 1187 dev->stop = hss_close; 1188 dev->do_ioctl = hss_ioctl; 1189 dev->weight = 16; 1190 dev->tx_queue_len = 100; 1191 port->settings.clock_type = CLOCK_EXT; 1192 port->settings.clock_rate = 2048000; 1193 1194 if (register_hdlc_device(dev)) { 1195 printk(KERN_ERR "HSS-%i: unable to register HDLC device\n", 1196 port->id); 1197 err = -ENOBUFS; 1198 goto err_free_netdev; 1199 } 1200 printk(KERN_INFO "%s: HSS-%i\n", dev->name, port->id); 1201 return 0; 1202 1203 err_free_netdev: 1204 free_netdev(dev); 1205 err_plat: 1206 npe_release(port->npe); 1207 platform_set_drvdata(pdev, NULL); 1208 err_free: 1209 kfree(port); 1210 return err; 1211 } 1212 1213 static int __devexit hss_remove_one(struct platform_device *pdev) 1214 { 1215 struct port *port = platform_get_drvdata(pdev); 1216 1217 unregister_hdlc_device(port->netdev); 1218 free_netdev(port->netdev); 1219 npe_release(port->npe); 1220 platform_set_drvdata(pdev, NULL); 1221 kfree(port); 1222 return 0; 1223 } 1224 1225 static struct platform_driver drv = { 1226 .driver.name = DRV_NAME, 1227 .probe = hss_init_one, 1228 .remove = hss_remove_one, 1229 }; 1230 1231 static int __init hss_init_module(void) 1232 { 1233 if ((ixp4xx_read_fuses() & (IXP4XX_FUSE_HDLC | IXP4XX_FUSE_HSS)) != 1234 (IXP4XX_FUSE_HDLC | IXP4XX_FUSE_HSS)) 1235 return -ENOSYS; 1236 return platform_driver_register(&drv); 1237 } 1238 1239 static void __exit hss_cleanup_module(void) 1240 { 1241 platform_driver_unregister(&drv); 1242 } 1243 1244 MODULE_AUTHOR("Krzysztof Halasa"); 1245 MODULE_DESCRIPTION("Intel IXP4xx HSS driver"); 1246 MODULE_LICENSE("GPL v2"); 1247 module_init(hss_init_module); 1248 module_exit(hss_cleanup_module); -
a/include/asm-arm/arch-ixp4xx/cpu.h
old new 28 28 #define cpu_is_ixp46x() ((processor_id & IXP4XX_PROCESSOR_ID_MASK) == \ 29 29 IXP465_PROCESSOR_ID_VALUE) 30 30 31 static inline u32 ixp4xx_read_fuses(void) 32 { 33 unsigned int fuses = ~*IXP4XX_EXP_CFG2; 34 fuses &= ~IXP4XX_FUSE_RESERVED; 35 if (!cpu_is_ixp46x()) 36 fuses &= ~IXP4XX_FUSE_IXP46X_ONLY; 37 38 return fuses; 39 } 40 41 static inline void ixp4xx_write_fuses(u32 value) 42 { 43 *IXP4XX_EXP_CFG2 = ~value; 44 } 45 31 46 #endif /* _ASM_ARCH_CPU_H */ -
a/include/asm-arm/arch-ixp4xx/hardware.h
old new 27 27 28 28 #define pcibios_assign_all_busses() 1 29 29 30 /* Register locations and bits */ 31 #include "ixp4xx-regs.h" 32 30 33 #ifndef __ASSEMBLER__ 31 34 #include <asm/arch/cpu.h> 32 35 #endif 33 36 34 /* Register locations and bits */35 #include "ixp4xx-regs.h"36 37 37 /* Platform helper functions and definitions */ 38 38 #include "platform.h" 39 39 -
a/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h
old new 607 607 608 608 #define DCMD_LENGTH 0x01fff /* length mask (max = 8K - 1) */ 609 609 610 /* Fuse Bits of IXP_EXP_CFG2 */ 611 #define IXP4XX_FUSE_RCOMP (1 << 0) 612 #define IXP4XX_FUSE_USB_DEVICE (1 << 1) 613 #define IXP4XX_FUSE_HASH (1 << 2) 614 #define IXP4XX_FUSE_AES (1 << 3) 615 #define IXP4XX_FUSE_DES (1 << 4) 616 #define IXP4XX_FUSE_HDLC (1 << 5) 617 #define IXP4XX_FUSE_AAL (1 << 6) 618 #define IXP4XX_FUSE_HSS (1 << 7) 619 #define IXP4XX_FUSE_UTOPIA (1 << 8) 620 #define IXP4XX_FUSE_NPEB_ETH0 (1 << 9) 621 #define IXP4XX_FUSE_NPEC_ETH (1 << 10) 622 #define IXP4XX_FUSE_RESET_NPEA (1 << 11) 623 #define IXP4XX_FUSE_RESET_NPEB (1 << 12) 624 #define IXP4XX_FUSE_RESET_NPEC (1 << 13) 625 #define IXP4XX_FUSE_PCI (1 << 14) 626 #define IXP4XX_FUSE_ECC_TIMESYNC (1 << 15) 627 #define IXP4XX_FUSE_UTOPIA_PHY_LIMIT (3 << 16) 628 #define IXP4XX_FUSE_USB_HOST (1 << 18) 629 #define IXP4XX_FUSE_NPEA_ETH (1 << 19) 630 #define IXP4XX_FUSE_NPEB_ETH_1_TO_3 (1 << 20) 631 #define IXP4XX_FUSE_RSA (1 << 21) 632 #define IXP4XX_FUSE_XSCALE_MAX_FREQ (3 << 22) 633 #define IXP4XX_FUSE_RESERVED (0xFF << 24) 634 635 #define IXP4XX_FUSE_IXP46X_ONLY (IXP4XX_FUSE_ECC_TIMESYNC | \ 636 IXP4XX_FUSE_USB_HOST | \ 637 IXP4XX_FUSE_NPEA_ETH | \ 638 IXP4XX_FUSE_NPEB_ETH_1_TO_3 | \ 639 IXP4XX_FUSE_RSA | \ 640 IXP4XX_FUSE_XSCALE_MAX_FREQ) 641 610 642 #endif -
/dev/null
old new 1 #ifndef __IXP4XX_NPE_H 2 #define __IXP4XX_NPE_H 3 4 #include <linux/etherdevice.h> 5 #include <linux/kernel.h> 6 #include <asm/io.h> 7 8 extern const char *npe_names[]; 9 10 struct npe_regs { 11 u32 exec_addr, exec_data, exec_status_cmd, exec_count; 12 u32 action_points[4]; 13 u32 watchpoint_fifo, watch_count; 14 u32 profile_count; 15 u32 messaging_status, messaging_control; 16 u32 mailbox_status, /*messaging_*/ in_out_fifo; 17 }; 18 19 struct npe { 20 struct resource *mem_res; 21 struct npe_regs __iomem *regs; 22 u32 regs_phys; 23 int id; 24 int valid; 25 }; 26 27 28 static inline const char *npe_name(struct npe *npe) 29 { 30 return npe_names[npe->id]; 31 } 32 33 int npe_running(struct npe *npe); 34 int npe_send_message(struct npe *npe, const void *msg, const char *what); 35 int npe_recv_message(struct npe *npe, void *msg, const char *what); 36 int npe_send_recv_message(struct npe *npe, void *msg, const char *what); 37 int npe_load_firmware(struct npe *npe, const char *name, struct device *dev); 38 struct npe *npe_request(int id); 39 void npe_release(struct npe *npe); 40 41 #endif /* __IXP4XX_NPE_H */ -
a/include/asm-arm/arch-ixp4xx/platform.h
old new 77 77 78 78 /* 79 79 * The IXP4xx chips do not have an I2C unit, so GPIO lines are just 80 * used to 81 * Used as platform_data to provide GPIO pin information to the ixp42x 80 * used as platform_data to provide GPIO pin information to the ixp42x 82 81 * I2C driver. 83 82 */ 84 83 struct ixp4xx_i2c_pins { … … 86 85 unsigned long scl_pin; 87 86 }; 88 87 88 #define IXP4XX_ETH_NPEA 0x00 89 #define IXP4XX_ETH_NPEB 0x10 90 #define IXP4XX_ETH_NPEC 0x20 91 92 /* Information about built-in Ethernet MAC interfaces */ 93 struct eth_plat_info { 94 u8 phy; /* MII PHY ID, 0 - 31 */ 95 u8 rxq; /* configurable, currently 0 - 31 only */ 96 u8 txreadyq; 97 u8 hwaddr[6]; 98 }; 99 100 /* Information about built-in HSS (synchronous serial) interfaces */ 101 struct hss_plat_info { 102 int (*set_clock)(int port, unsigned int clock_type); 103 int (*open)(int port, void *pdev, 104 void (*set_carrier_cb)(void *pdev, int carrier)); 105 void (*close)(int port, void *pdev); 106 u8 txreadyq; 107 }; 108 89 109 /* 90 110 * This structure provide a means for the board setup code 91 111 * to give information to th pata_ixp4xx driver. It is -
/dev/null
old new 1 /* 2 * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl> 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of version 2 of the GNU General Public License 6 * as published by the Free Software Foundation. 7 */ 8 9 #ifndef IXP4XX_QMGR_H 10 #define IXP4XX_QMGR_H 11 12 #include <linux/kernel.h> 13 #include <asm/io.h> 14 15 #define HALF_QUEUES 32 16 #define QUEUES 64 /* only 32 lower queues currently supported */ 17 #define MAX_QUEUE_LENGTH 4 /* in dwords */ 18 19 #define QUEUE_STAT1_EMPTY 1 /* queue status bits */ 20 #define QUEUE_STAT1_NEARLY_EMPTY 2 21 #define QUEUE_STAT1_NEARLY_FULL 4 22 #define QUEUE_STAT1_FULL 8 23 #define QUEUE_STAT2_UNDERFLOW 1 24 #define QUEUE_STAT2_OVERFLOW 2 25 26 #define QUEUE_WATERMARK_0_ENTRIES 0 27 #define QUEUE_WATERMARK_1_ENTRY 1 28 #define QUEUE_WATERMARK_2_ENTRIES 2 29 #define QUEUE_WATERMARK_4_ENTRIES 3 30 #define QUEUE_WATERMARK_8_ENTRIES 4 31 #define QUEUE_WATERMARK_16_ENTRIES 5 32 #define QUEUE_WATERMARK_32_ENTRIES 6 33 #define QUEUE_WATERMARK_64_ENTRIES 7 34 35 /* queue interrupt request conditions */ 36 #define QUEUE_IRQ_SRC_EMPTY 0 37 #define QUEUE_IRQ_SRC_NEARLY_EMPTY 1 38 #define QUEUE_IRQ_SRC_NEARLY_FULL 2 39 #define QUEUE_IRQ_SRC_FULL 3 40 #define QUEUE_IRQ_SRC_NOT_EMPTY 4 41 #define QUEUE_IRQ_SRC_NOT_NEARLY_EMPTY 5 42 #define QUEUE_IRQ_SRC_NOT_NEARLY_FULL 6 43 #define QUEUE_IRQ_SRC_NOT_FULL 7 44 45 struct qmgr_regs { 46 u32 acc[QUEUES][MAX_QUEUE_LENGTH]; /* 0x000 - 0x3FF */ 47 u32 stat1[4]; /* 0x400 - 0x40F */ 48 u32 stat2[2]; /* 0x410 - 0x417 */ 49 u32 statne_h; /* 0x418 - queue nearly empty */ 50 u32 statf_h; /* 0x41C - queue full */ 51 u32 irqsrc[4]; /* 0x420 - 0x42F IRC source */ 52 u32 irqen[2]; /* 0x430 - 0x437 IRQ enabled */ 53 u32 irqstat[2]; /* 0x438 - 0x43F - IRQ access only */ 54 u32 reserved[1776]; 55 u32 sram[2048]; /* 0x2000 - 0x3FFF - config and buffer */ 56 }; 57 58 extern struct qmgr_regs __iomem *qmgr_regs; 59 60 void qmgr_set_irq(unsigned int queue, int src, 61 void (*handler)(void *pdev), void *pdev); 62 void qmgr_enable_irq(unsigned int queue); 63 void qmgr_disable_irq(unsigned int queue); 64 65 /* request_ and release_queue() must be called from non-IRQ context */ 66 int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */, 67 unsigned int nearly_empty_watermark, 68 unsigned int nearly_full_watermark); 69 void qmgr_release_queue(unsigned int queue); 70 71 72 static inline void qmgr_put_entry(unsigned int queue, u32 val) 73 { 74 __raw_writel(val, &qmgr_regs->acc[queue][0]); 75 } 76 77 static inline u32 qmgr_get_entry(unsigned int queue) 78 { 79 return __raw_readl(&qmgr_regs->acc[queue][0]); 80 } 81 82 static inline int qmgr_get_stat1(unsigned int queue) 83 { 84 return (__raw_readl(&qmgr_regs->stat1[queue >> 3]) 85 >> ((queue & 7) << 2)) & 0xF; 86 } 87 88 static inline int qmgr_get_stat2(unsigned int queue) 89 { 90 return (__raw_readl(&qmgr_regs->stat2[queue >> 4]) 91 >> ((queue & 0xF) << 1)) & 0x3; 92 } 93 94 static inline int qmgr_stat_empty(unsigned int queue) 95 { 96 return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_EMPTY); 97 } 98 99 static inline int qmgr_stat_nearly_empty(unsigned int queue) 100 { 101 return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_EMPTY); 102 } 103 104 static inline int qmgr_stat_nearly_full(unsigned int queue) 105 { 106 return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_FULL); 107 } 108 109 static inline int qmgr_stat_full(unsigned int queue) 110 { 111 return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_FULL); 112 } 113 114 static inline int qmgr_stat_underflow(unsigned int queue) 115 { 116 return !!(qmgr_get_stat2(queue) & QUEUE_STAT2_UNDERFLOW); 117 } 118 119 static inline int qmgr_stat_overflow(unsigned int queue) 120 { 121 return !!(qmgr_get_stat2(queue) & QUEUE_STAT2_OVERFLOW); 122 } 123 124 #endif -
a/include/asm-arm/arch-ixp4xx/uncompress.h
old new 13 13 #ifndef _ARCH_UNCOMPRESS_H_ 14 14 #define _ARCH_UNCOMPRESS_H_ 15 15 16 #include <asm/hardware.h> 16 #define __ASM_ARCH_HARDWARE_H__ 17 #include "ixp4xx-regs.h" 17 18 #include <asm/mach-types.h> 18 19 #include <linux/serial_reg.h> 19 20
Note: See TracBrowser for help on using the browser.
