root/trunk/patches/2.6.22/41-ixp4xx-net-drivers.patch

Revision 919, 108.9 kB (checked in by gordon, 2 years ago)

Update IXP4XX network drivers to Krzysztof's latest version from git
(41068c53d4f18fbcec81739998ebb5955ac22cf9)

  • a/arch/arm/kernel/setup.c

    old new  
    6060extern void _stext, _text, _etext, __data_start, _edata, _end; 
    6161 
    6262unsigned int processor_id; 
     63EXPORT_SYMBOL(processor_id); 
    6364unsigned int __machine_arch_type; 
    6465EXPORT_SYMBOL(__machine_arch_type); 
    6566 
  • a/arch/arm/mach-ixp4xx/Kconfig

    old new  
    173173          need to use the indirect method instead. If you don't know 
    174174          what you need, leave this option unselected. 
    175175 
     176config 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 
     182config 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 
    176190endmenu 
    177191 
    178192endif 
  • a/arch/arm/mach-ixp4xx/Makefile

    old new  
    2626obj-$(CONFIG_MACH_DSMG600)      += dsmg600-setup.o dsmg600-power.o 
    2727 
    2828obj-$(CONFIG_PCI)               += $(obj-pci-$(CONFIG_PCI)) common-pci.o 
     29obj-$(CONFIG_IXP4XX_QMGR)       += ixp4xx_qmgr.o 
     30obj-$(CONFIG_IXP4XX_NPE)        += ixp4xx_npe.o 
  • a/arch/arm/mach-ixp4xx/ixdp425-setup.c

    old new  
    101101        .resource               = ixdp425_uart_resources 
    102102}; 
    103103 
     104/* Built-in 10/100 Ethernet MAC interfaces */ 
     105static 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 
     117static 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 
    104129static struct platform_device *ixdp425_devices[] __initdata = { 
    105130        &ixdp425_i2c_gpio, 
    106131        &ixdp425_flash, 
    107         &ixdp425_uart 
     132        &ixdp425_uart, 
     133        &ixdp425_eth[0], 
     134        &ixdp425_eth[1], 
    108135}; 
    109136 
    110137static 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 
     120const 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 
     132static 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 
     150static 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 
     166int npe_running(struct npe *npe) 
     167{ 
     168        return (__raw_readl(&npe->regs->exec_status_cmd) & STAT_RUN) != 0; 
     169} 
     170 
     171static 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 
     178static 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 
     190static 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 
     196static 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 
     207static 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 
     213static 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 
     256static 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 
     267static 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 
     278static 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 
     287static 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 
     415int 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 
     452int 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 
     488int 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 
     507int 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 
     659too_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); 
     664err: 
     665        release_firmware(fw_entry); 
     666        return err; 
     667} 
     668 
     669 
     670struct 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 
     679void npe_release(struct npe *npe) 
     680{ 
     681        module_put(THIS_MODULE); 
     682} 
     683 
     684 
     685static 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 
     713static 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 
     724module_init(npe_init_module); 
     725module_exit(npe_cleanup_module); 
     726 
     727MODULE_AUTHOR("Krzysztof Halasa"); 
     728MODULE_LICENSE("GPL v2"); 
     729 
     730EXPORT_SYMBOL(npe_names); 
     731EXPORT_SYMBOL(npe_running); 
     732EXPORT_SYMBOL(npe_request); 
     733EXPORT_SYMBOL(npe_release); 
     734EXPORT_SYMBOL(npe_load_firmware); 
     735EXPORT_SYMBOL(npe_send_message); 
     736EXPORT_SYMBOL(npe_recv_message); 
     737EXPORT_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 
     19struct qmgr_regs __iomem *qmgr_regs; 
     20static struct resource *mem_res; 
     21static spinlock_t qmgr_lock; 
     22static u32 used_sram_bitmap[4]; /* 128 16-dword pages */ 
     23static void (*irq_handlers[HALF_QUEUES])(void *pdev); 
     24static void *irq_pdevs[HALF_QUEUES]; 
     25 
     26void 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 
     42static 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 
     56void 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 
     66void 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 
     76static 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 
     84int 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 
     162err: 
     163        spin_unlock_irq(&qmgr_lock); 
     164        module_put(THIS_MODULE); 
     165        return err; 
     166} 
     167 
     168void 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 
     205static 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 
     248error_irq: 
     249        iounmap(qmgr_regs); 
     250error_map: 
     251        release_resource(mem_res); 
     252        return err; 
     253} 
     254 
     255static 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 
     263module_init(qmgr_init); 
     264module_exit(qmgr_remove); 
     265 
     266MODULE_LICENSE("GPL v2"); 
     267MODULE_AUTHOR("Krzysztof Halasa"); 
     268 
     269EXPORT_SYMBOL(qmgr_regs); 
     270EXPORT_SYMBOL(qmgr_set_irq); 
     271EXPORT_SYMBOL(qmgr_enable_irq); 
     272EXPORT_SYMBOL(qmgr_disable_irq); 
     273EXPORT_SYMBOL(qmgr_request_queue); 
     274EXPORT_SYMBOL(qmgr_release_queue); 
  • a/drivers/net/arm/Kconfig

    old new  
    4646        help 
    4747          This is a driver for the ethernet hardware included in EP93xx CPUs. 
    4848          Say Y if you are building a kernel for EP93xx based devices. 
     49 
     50config 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  
    99obj-$(CONFIG_ARM_ETHER1)        += ether1.o 
    1010obj-$(CONFIG_ARM_AT91_ETHER)    += at91_ether.o 
    1111obj-$(CONFIG_EP93XX_ETH)        += ep93xx_eth.o 
     12obj-$(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__ 
     130typedef struct sk_buff buffer_t; 
     131#define free_buffer dev_kfree_skb 
     132#define free_buffer_irq dev_kfree_skb_irq 
     133#else 
     134typedef void buffer_t; 
     135#define free_buffer kfree 
     136#define free_buffer_irq kfree 
     137#endif 
     138 
     139struct 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 
     158struct 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 */ 
     175struct 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 */ 
     186struct 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__ 
     232static 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 
     240static spinlock_t mdio_lock; 
     241static struct eth_regs __iomem *mdio_regs; /* mdio command and status only */ 
     242static int ports_open; 
     243static struct port *npe_port_tab[MAX_NPES]; 
     244static struct dma_pool *dma_pool; 
     245 
     246 
     247static 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 
     294static 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 
     305static 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 
     315static 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 
     337static 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 
     348static 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 
     368static 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 
     377static 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 
     396static 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 
     411static 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 
     438static 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 
     445static 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 
     464static 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 
     475static 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 
     488static 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 
     500static 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 
     612static 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 
     660static 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 
     748static struct net_device_stats *eth_stats(struct net_device *dev) 
     749{ 
     750        struct port *port = netdev_priv(dev); 
     751        return &port->stat; 
     752} 
     753 
     754static 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 
     784static 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 
     799static 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 
     827rel_txready: 
     828        qmgr_release_queue(port->plat->txreadyq); 
     829rel_tx: 
     830        qmgr_release_queue(TX_QUEUE(port->id)); 
     831rel_rx: 
     832        qmgr_release_queue(port->plat->rxq); 
     833rel_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 
     840static 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 
     851static 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 
     894static 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 
     927static 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 
     1028static 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 
     1116static 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 
     1207err_unreg: 
     1208        unregister_netdev(dev); 
     1209err_npe_rel: 
     1210        npe_release(port->npe); 
     1211err_free: 
     1212        free_netdev(dev); 
     1213        return err; 
     1214} 
     1215 
     1216static 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 
     1230static struct platform_driver drv = { 
     1231        .driver.name    = DRV_NAME, 
     1232        .probe          = eth_init_one, 
     1233        .remove         = eth_remove_one, 
     1234}; 
     1235 
     1236static 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 
     1249static void __exit eth_cleanup_module(void) 
     1250{ 
     1251        platform_driver_unregister(&drv); 
     1252} 
     1253 
     1254MODULE_AUTHOR("Krzysztof Halasa"); 
     1255MODULE_DESCRIPTION("Intel IXP4xx Ethernet driver"); 
     1256MODULE_LICENSE("GPL v2"); 
     1257module_init(eth_init_module); 
     1258module_exit(eth_cleanup_module); 
  • a/drivers/net/wan/Kconfig

    old new  
    334334 
    335335          Say Y if your card supports this feature. 
    336336 
     337config 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 
    337346config DLCI 
    338347        tristate "Frame Relay DLCI support" 
    339348        ---help--- 
  • a/drivers/net/wan/Makefile

    old new  
    4242obj-$(CONFIG_WANXL)             += wanxl.o 
    4343obj-$(CONFIG_PCI200SYN)         += pci200syn.o 
    4444obj-$(CONFIG_PC300TOO)          += pc300too.o 
     45obj-$(CONFIG_IXP4XX_HSS)        += ixp4xx_hss.o 
    4546 
    4647clean-files := wanxlfw.inc 
    4748$(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__ 
     223typedef struct sk_buff buffer_t; 
     224#define free_buffer dev_kfree_skb 
     225#define free_buffer_irq dev_kfree_skb_irq 
     226#else 
     227typedef void buffer_t; 
     228#define free_buffer kfree 
     229#define free_buffer_irq kfree 
     230#endif 
     231 
     232struct 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 */ 
     245struct 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 */ 
     264struct 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__ 
     295static 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 
     303static int ports_open; 
     304static struct dma_pool *dma_pool; 
     305 
     306static 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 
     315static inline struct port* dev_to_port(struct net_device *dev) 
     316{ 
     317        return dev_to_hdlc(dev)->priv; 
     318} 
     319 
     320 
     321static 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 
     338static 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 
     347static 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 
     375static 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 
     382static 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 
     401static 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 
     412static 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 
     425static 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 
     434static 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 
     446static 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 
     590static 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 
     631static 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 
     719static 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 
     744rel_txready: 
     745        qmgr_release_queue(port->plat->txreadyq); 
     746rel_tx: 
     747        qmgr_release_queue(queue_ids[port->id].tx); 
     748rel_rx: 
     749        qmgr_release_queue(queue_ids[port->id].rx); 
     750rel_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 
     757static 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 
     766static 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 
     809static 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 
     842static 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 
     1012err_destroy_queues: 
     1013        destroy_queues(port); 
     1014        release_queues(port); 
     1015err_plat_close: 
     1016        if (port->plat->close) 
     1017                port->plat->close(port->id, port->netdev); 
     1018err_hdlc_close: 
     1019        hdlc_close(dev); 
     1020        return err; 
     1021} 
     1022 
     1023static 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 
     1083static 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 
     1106static 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 
     1157static 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 
     1203err_free_netdev: 
     1204        free_netdev(dev); 
     1205err_plat: 
     1206        npe_release(port->npe); 
     1207        platform_set_drvdata(pdev, NULL); 
     1208err_free: 
     1209        kfree(port); 
     1210        return err; 
     1211} 
     1212 
     1213static 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 
     1225static struct platform_driver drv = { 
     1226        .driver.name    = DRV_NAME, 
     1227        .probe          = hss_init_one, 
     1228        .remove         = hss_remove_one, 
     1229}; 
     1230 
     1231static 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 
     1239static void __exit hss_cleanup_module(void) 
     1240{ 
     1241        platform_driver_unregister(&drv); 
     1242} 
     1243 
     1244MODULE_AUTHOR("Krzysztof Halasa"); 
     1245MODULE_DESCRIPTION("Intel IXP4xx HSS driver"); 
     1246MODULE_LICENSE("GPL v2"); 
     1247module_init(hss_init_module); 
     1248module_exit(hss_cleanup_module); 
  • a/include/asm-arm/arch-ixp4xx/cpu.h

    old new  
    2828#define cpu_is_ixp46x() ((processor_id & IXP4XX_PROCESSOR_ID_MASK) == \ 
    2929                          IXP465_PROCESSOR_ID_VALUE) 
    3030 
     31static 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 
     41static inline void ixp4xx_write_fuses(u32 value) 
     42{ 
     43        *IXP4XX_EXP_CFG2 = ~value; 
     44} 
     45 
    3146#endif  /* _ASM_ARCH_CPU_H */ 
  • a/include/asm-arm/arch-ixp4xx/hardware.h

    old new  
    2727 
    2828#define pcibios_assign_all_busses()     1 
    2929 
     30/* Register locations and bits */ 
     31#include "ixp4xx-regs.h" 
     32 
    3033#ifndef __ASSEMBLER__ 
    3134#include <asm/arch/cpu.h> 
    3235#endif 
    3336 
    34 /* Register locations and bits */ 
    35 #include "ixp4xx-regs.h" 
    36  
    3737/* Platform helper functions and definitions */ 
    3838#include "platform.h" 
    3939 
  • a/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h

    old new  
    607607 
    608608#define DCMD_LENGTH     0x01fff         /* length mask (max = 8K - 1) */ 
    609609 
     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 
    610642#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 
     8extern const char *npe_names[]; 
     9 
     10struct 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 
     19struct 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 
     28static inline const char *npe_name(struct npe *npe) 
     29{ 
     30        return npe_names[npe->id]; 
     31} 
     32 
     33int npe_running(struct npe *npe); 
     34int npe_send_message(struct npe *npe, const void *msg, const char *what); 
     35int npe_recv_message(struct npe *npe, void *msg, const char *what); 
     36int npe_send_recv_message(struct npe *npe, void *msg, const char *what); 
     37int npe_load_firmware(struct npe *npe, const char *name, struct device *dev); 
     38struct npe *npe_request(int id); 
     39void npe_release(struct npe *npe); 
     40 
     41#endif /* __IXP4XX_NPE_H */ 
  • a/include/asm-arm/arch-ixp4xx/platform.h

    old new  
    7777 
    7878/* 
    7979 * 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 
    8281 * I2C driver. 
    8382 */ 
    8483struct ixp4xx_i2c_pins { 
     
    8685        unsigned long scl_pin; 
    8786}; 
    8887 
     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 */ 
     93struct 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 */ 
     101struct 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 
    89109/* 
    90110 * This structure provide a means for the board setup code 
    91111 * 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 
     45struct 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 
     58extern struct qmgr_regs __iomem *qmgr_regs; 
     59 
     60void qmgr_set_irq(unsigned int queue, int src, 
     61                  void (*handler)(void *pdev), void *pdev); 
     62void qmgr_enable_irq(unsigned int queue); 
     63void qmgr_disable_irq(unsigned int queue); 
     64 
     65/* request_ and release_queue() must be called from non-IRQ context */ 
     66int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */, 
     67                       unsigned int nearly_empty_watermark, 
     68                       unsigned int nearly_full_watermark); 
     69void qmgr_release_queue(unsigned int queue); 
     70 
     71 
     72static inline void qmgr_put_entry(unsigned int queue, u32 val) 
     73{ 
     74        __raw_writel(val, &qmgr_regs->acc[queue][0]); 
     75} 
     76 
     77static inline u32 qmgr_get_entry(unsigned int queue) 
     78{ 
     79        return __raw_readl(&qmgr_regs->acc[queue][0]); 
     80} 
     81 
     82static 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 
     88static 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 
     94static inline int qmgr_stat_empty(unsigned int queue) 
     95{ 
     96        return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_EMPTY); 
     97} 
     98 
     99static inline int qmgr_stat_nearly_empty(unsigned int queue) 
     100{ 
     101        return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_EMPTY); 
     102} 
     103 
     104static inline int qmgr_stat_nearly_full(unsigned int queue) 
     105{ 
     106        return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_FULL); 
     107} 
     108 
     109static inline int qmgr_stat_full(unsigned int queue) 
     110{ 
     111        return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_FULL); 
     112} 
     113 
     114static inline int qmgr_stat_underflow(unsigned int queue) 
     115{ 
     116        return !!(qmgr_get_stat2(queue) & QUEUE_STAT2_UNDERFLOW); 
     117} 
     118 
     119static 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  
    1313#ifndef _ARCH_UNCOMPRESS_H_ 
    1414#define _ARCH_UNCOMPRESS_H_ 
    1515 
    16 #include <asm/hardware.h> 
     16#define __ASM_ARCH_HARDWARE_H__ 
     17#include "ixp4xx-regs.h" 
    1718#include <asm/mach-types.h> 
    1819#include <linux/serial_reg.h> 
    1920 
Note: See TracBrowser for help on using the browser.