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

can: add driver for Softing card

This patch adds a driver for the platform:softing device.
This will create (up to) 2 CAN network devices from 1
platform:softing device

Signed-off-by: Kurt Van Dijck <kurt.van.dijck@eia.be>
Acked-by: Wolfgang Grandegger <wg@grandegger.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Kurt Van Dijck and committed by
David S. Miller
03fd3cf5 2221eca0

+1815
+2
drivers/net/can/Kconfig
··· 117 117 118 118 source "drivers/net/can/usb/Kconfig" 119 119 120 + source "drivers/net/can/softing/Kconfig" 121 + 120 122 config CAN_DEBUG_DEVICES 121 123 bool "CAN devices debugging messages" 122 124 depends on CAN
+1
drivers/net/can/Makefile
··· 9 9 can-dev-y := dev.o 10 10 11 11 obj-y += usb/ 12 + obj-y += softing/ 12 13 13 14 obj-$(CONFIG_CAN_SJA1000) += sja1000/ 14 15 obj-$(CONFIG_CAN_MSCAN) += mscan/
+16
drivers/net/can/softing/Kconfig
··· 1 + config CAN_SOFTING 2 + tristate "Softing Gmbh CAN generic support" 3 + depends on CAN_DEV 4 + ---help--- 5 + Support for CAN cards from Softing Gmbh & some cards 6 + from Vector Gmbh. 7 + Softing Gmbh CAN cards come with 1 or 2 physical busses. 8 + Those cards typically use Dual Port RAM to communicate 9 + with the host CPU. The interface is then identical for PCI 10 + and PCMCIA cards. This driver operates on a platform device, 11 + which has been created by softing_cs or softing_pci driver. 12 + Warning: 13 + The API of the card does not allow fine control per bus, but 14 + controls the 2 busses on the card together. 15 + As such, some actions (start/stop/busoff recovery) on 1 bus 16 + must bring down the other bus too temporarily.
+5
drivers/net/can/softing/Makefile
··· 1 + 2 + softing-y := softing_main.o softing_fw.o 3 + obj-$(CONFIG_CAN_SOFTING) += softing.o 4 + 5 + ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
+167
drivers/net/can/softing/softing.h
··· 1 + /* 2 + * softing common interfaces 3 + * 4 + * by Kurt Van Dijck, 2008-2010 5 + */ 6 + 7 + #include <linux/atomic.h> 8 + #include <linux/netdevice.h> 9 + #include <linux/ktime.h> 10 + #include <linux/mutex.h> 11 + #include <linux/spinlock.h> 12 + #include <linux/can.h> 13 + #include <linux/can/dev.h> 14 + 15 + #include "softing_platform.h" 16 + 17 + struct softing; 18 + 19 + struct softing_priv { 20 + struct can_priv can; /* must be the first member! */ 21 + struct net_device *netdev; 22 + struct softing *card; 23 + struct { 24 + int pending; 25 + /* variables wich hold the circular buffer */ 26 + int echo_put; 27 + int echo_get; 28 + } tx; 29 + struct can_bittiming_const btr_const; 30 + int index; 31 + uint8_t output; 32 + uint16_t chip; 33 + }; 34 + #define netdev2softing(netdev) ((struct softing_priv *)netdev_priv(netdev)) 35 + 36 + struct softing { 37 + const struct softing_platform_data *pdat; 38 + struct platform_device *pdev; 39 + struct net_device *net[2]; 40 + spinlock_t spin; /* protect this structure & DPRAM access */ 41 + ktime_t ts_ref; 42 + ktime_t ts_overflow; /* timestamp overflow value, in ktime */ 43 + 44 + struct { 45 + /* indication of firmware status */ 46 + int up; 47 + /* protection of the 'up' variable */ 48 + struct mutex lock; 49 + } fw; 50 + struct { 51 + int nr; 52 + int requested; 53 + int svc_count; 54 + unsigned int dpram_position; 55 + } irq; 56 + struct { 57 + int pending; 58 + int last_bus; 59 + /* 60 + * keep the bus that last tx'd a message, 61 + * in order to let every netdev queue resume 62 + */ 63 + } tx; 64 + __iomem uint8_t *dpram; 65 + unsigned long dpram_phys; 66 + unsigned long dpram_size; 67 + struct { 68 + uint16_t fw_version, hw_version, license, serial; 69 + uint16_t chip[2]; 70 + unsigned int freq; /* remote cpu's operating frequency */ 71 + } id; 72 + }; 73 + 74 + extern int softing_default_output(struct net_device *netdev); 75 + 76 + extern ktime_t softing_raw2ktime(struct softing *card, u32 raw); 77 + 78 + extern int softing_chip_poweron(struct softing *card); 79 + 80 + extern int softing_bootloader_command(struct softing *card, int16_t cmd, 81 + const char *msg); 82 + 83 + /* Load firmware after reset */ 84 + extern int softing_load_fw(const char *file, struct softing *card, 85 + __iomem uint8_t *virt, unsigned int size, int offset); 86 + 87 + /* Load final application firmware after bootloader */ 88 + extern int softing_load_app_fw(const char *file, struct softing *card); 89 + 90 + /* 91 + * enable or disable irq 92 + * only called with fw.lock locked 93 + */ 94 + extern int softing_enable_irq(struct softing *card, int enable); 95 + 96 + /* start/stop 1 bus on card */ 97 + extern int softing_startstop(struct net_device *netdev, int up); 98 + 99 + /* netif_rx() */ 100 + extern int softing_netdev_rx(struct net_device *netdev, 101 + const struct can_frame *msg, ktime_t ktime); 102 + 103 + /* SOFTING DPRAM mappings */ 104 + #define DPRAM_RX 0x0000 105 + #define DPRAM_RX_SIZE 32 106 + #define DPRAM_RX_CNT 16 107 + #define DPRAM_RX_RD 0x0201 /* uint8_t */ 108 + #define DPRAM_RX_WR 0x0205 /* uint8_t */ 109 + #define DPRAM_RX_LOST 0x0207 /* uint8_t */ 110 + 111 + #define DPRAM_FCT_PARAM 0x0300 /* int16_t [20] */ 112 + #define DPRAM_FCT_RESULT 0x0328 /* int16_t */ 113 + #define DPRAM_FCT_HOST 0x032b /* uint16_t */ 114 + 115 + #define DPRAM_INFO_BUSSTATE 0x0331 /* uint16_t */ 116 + #define DPRAM_INFO_BUSSTATE2 0x0335 /* uint16_t */ 117 + #define DPRAM_INFO_ERRSTATE 0x0339 /* uint16_t */ 118 + #define DPRAM_INFO_ERRSTATE2 0x033d /* uint16_t */ 119 + #define DPRAM_RESET 0x0341 /* uint16_t */ 120 + #define DPRAM_CLR_RECV_FIFO 0x0345 /* uint16_t */ 121 + #define DPRAM_RESET_TIME 0x034d /* uint16_t */ 122 + #define DPRAM_TIME 0x0350 /* uint64_t */ 123 + #define DPRAM_WR_START 0x0358 /* uint8_t */ 124 + #define DPRAM_WR_END 0x0359 /* uint8_t */ 125 + #define DPRAM_RESET_RX_FIFO 0x0361 /* uint16_t */ 126 + #define DPRAM_RESET_TX_FIFO 0x0364 /* uint8_t */ 127 + #define DPRAM_READ_FIFO_LEVEL 0x0365 /* uint8_t */ 128 + #define DPRAM_RX_FIFO_LEVEL 0x0366 /* uint16_t */ 129 + #define DPRAM_TX_FIFO_LEVEL 0x0366 /* uint16_t */ 130 + 131 + #define DPRAM_TX 0x0400 /* uint16_t */ 132 + #define DPRAM_TX_SIZE 16 133 + #define DPRAM_TX_CNT 32 134 + #define DPRAM_TX_RD 0x0601 /* uint8_t */ 135 + #define DPRAM_TX_WR 0x0605 /* uint8_t */ 136 + 137 + #define DPRAM_COMMAND 0x07e0 /* uint16_t */ 138 + #define DPRAM_RECEIPT 0x07f0 /* uint16_t */ 139 + #define DPRAM_IRQ_TOHOST 0x07fe /* uint8_t */ 140 + #define DPRAM_IRQ_TOCARD 0x07ff /* uint8_t */ 141 + 142 + #define DPRAM_V2_RESET 0x0e00 /* uint8_t */ 143 + #define DPRAM_V2_IRQ_TOHOST 0x0e02 /* uint8_t */ 144 + 145 + #define TXMAX (DPRAM_TX_CNT - 1) 146 + 147 + /* DPRAM return codes */ 148 + #define RES_NONE 0 149 + #define RES_OK 1 150 + #define RES_NOK 2 151 + #define RES_UNKNOWN 3 152 + /* DPRAM flags */ 153 + #define CMD_TX 0x01 154 + #define CMD_ACK 0x02 155 + #define CMD_XTD 0x04 156 + #define CMD_RTR 0x08 157 + #define CMD_ERR 0x10 158 + #define CMD_BUS2 0x80 159 + 160 + /* returned fifo entry bus state masks */ 161 + #define SF_MASK_BUSOFF 0x80 162 + #define SF_MASK_EPASSIVE 0x60 163 + 164 + /* bus states */ 165 + #define STATE_BUSOFF 2 166 + #define STATE_EPASSIVE 1 167 + #define STATE_EACTIVE 0
+691
drivers/net/can/softing/softing_fw.c
··· 1 + /* 2 + * Copyright (C) 2008-2010 3 + * 4 + * - Kurt Van Dijck, EIA Electronics 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the version 2 of the GNU General Public License 8 + * as published by the Free Software Foundation 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program; if not, write to the Free Software 17 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 + */ 19 + 20 + #include <linux/firmware.h> 21 + #include <linux/sched.h> 22 + #include <asm/div64.h> 23 + 24 + #include "softing.h" 25 + 26 + /* 27 + * low level DPRAM command. 28 + * Make sure that card->dpram[DPRAM_FCT_HOST] is preset 29 + */ 30 + static int _softing_fct_cmd(struct softing *card, int16_t cmd, uint16_t vector, 31 + const char *msg) 32 + { 33 + int ret; 34 + unsigned long stamp; 35 + 36 + iowrite16(cmd, &card->dpram[DPRAM_FCT_PARAM]); 37 + iowrite8(vector >> 8, &card->dpram[DPRAM_FCT_HOST + 1]); 38 + iowrite8(vector, &card->dpram[DPRAM_FCT_HOST]); 39 + /* be sure to flush this to the card */ 40 + wmb(); 41 + stamp = jiffies + 1 * HZ; 42 + /* wait for card */ 43 + do { 44 + /* DPRAM_FCT_HOST is _not_ aligned */ 45 + ret = ioread8(&card->dpram[DPRAM_FCT_HOST]) + 46 + (ioread8(&card->dpram[DPRAM_FCT_HOST + 1]) << 8); 47 + /* don't have any cached variables */ 48 + rmb(); 49 + if (ret == RES_OK) 50 + /* read return-value now */ 51 + return ioread16(&card->dpram[DPRAM_FCT_RESULT]); 52 + 53 + if ((ret != vector) || time_after(jiffies, stamp)) 54 + break; 55 + /* process context => relax */ 56 + usleep_range(500, 10000); 57 + } while (1); 58 + 59 + ret = (ret == RES_NONE) ? -ETIMEDOUT : -ECANCELED; 60 + dev_alert(&card->pdev->dev, "firmware %s failed (%i)\n", msg, ret); 61 + return ret; 62 + } 63 + 64 + static int softing_fct_cmd(struct softing *card, int16_t cmd, const char *msg) 65 + { 66 + int ret; 67 + 68 + ret = _softing_fct_cmd(card, cmd, 0, msg); 69 + if (ret > 0) { 70 + dev_alert(&card->pdev->dev, "%s returned %u\n", msg, ret); 71 + ret = -EIO; 72 + } 73 + return ret; 74 + } 75 + 76 + int softing_bootloader_command(struct softing *card, int16_t cmd, 77 + const char *msg) 78 + { 79 + int ret; 80 + unsigned long stamp; 81 + 82 + iowrite16(RES_NONE, &card->dpram[DPRAM_RECEIPT]); 83 + iowrite16(cmd, &card->dpram[DPRAM_COMMAND]); 84 + /* be sure to flush this to the card */ 85 + wmb(); 86 + stamp = jiffies + 3 * HZ; 87 + /* wait for card */ 88 + do { 89 + ret = ioread16(&card->dpram[DPRAM_RECEIPT]); 90 + /* don't have any cached variables */ 91 + rmb(); 92 + if (ret == RES_OK) 93 + return 0; 94 + if (time_after(jiffies, stamp)) 95 + break; 96 + /* process context => relax */ 97 + usleep_range(500, 10000); 98 + } while (!signal_pending(current)); 99 + 100 + ret = (ret == RES_NONE) ? -ETIMEDOUT : -ECANCELED; 101 + dev_alert(&card->pdev->dev, "bootloader %s failed (%i)\n", msg, ret); 102 + return ret; 103 + } 104 + 105 + static int fw_parse(const uint8_t **pmem, uint16_t *ptype, uint32_t *paddr, 106 + uint16_t *plen, const uint8_t **pdat) 107 + { 108 + uint16_t checksum[2]; 109 + const uint8_t *mem; 110 + const uint8_t *end; 111 + 112 + /* 113 + * firmware records are a binary, unaligned stream composed of: 114 + * uint16_t type; 115 + * uint32_t addr; 116 + * uint16_t len; 117 + * uint8_t dat[len]; 118 + * uint16_t checksum; 119 + * all values in little endian. 120 + * We could define a struct for this, with __attribute__((packed)), 121 + * but would that solve the alignment in _all_ cases (cfr. the 122 + * struct itself may be an odd address)? 123 + * 124 + * I chose to use leXX_to_cpup() since this solves both 125 + * endianness & alignment. 126 + */ 127 + mem = *pmem; 128 + *ptype = le16_to_cpup((void *)&mem[0]); 129 + *paddr = le32_to_cpup((void *)&mem[2]); 130 + *plen = le16_to_cpup((void *)&mem[6]); 131 + *pdat = &mem[8]; 132 + /* verify checksum */ 133 + end = &mem[8 + *plen]; 134 + checksum[0] = le16_to_cpup((void *)end); 135 + for (checksum[1] = 0; mem < end; ++mem) 136 + checksum[1] += *mem; 137 + if (checksum[0] != checksum[1]) 138 + return -EINVAL; 139 + /* increment */ 140 + *pmem += 10 + *plen; 141 + return 0; 142 + } 143 + 144 + int softing_load_fw(const char *file, struct softing *card, 145 + __iomem uint8_t *dpram, unsigned int size, int offset) 146 + { 147 + const struct firmware *fw; 148 + int ret; 149 + const uint8_t *mem, *end, *dat; 150 + uint16_t type, len; 151 + uint32_t addr; 152 + uint8_t *buf = NULL; 153 + int buflen = 0; 154 + int8_t type_end = 0; 155 + 156 + ret = request_firmware(&fw, file, &card->pdev->dev); 157 + if (ret < 0) 158 + return ret; 159 + dev_dbg(&card->pdev->dev, "%s, firmware(%s) got %u bytes" 160 + ", offset %c0x%04x\n", 161 + card->pdat->name, file, (unsigned int)fw->size, 162 + (offset >= 0) ? '+' : '-', (unsigned int)abs(offset)); 163 + /* parse the firmware */ 164 + mem = fw->data; 165 + end = &mem[fw->size]; 166 + /* look for header record */ 167 + ret = fw_parse(&mem, &type, &addr, &len, &dat); 168 + if (ret < 0) 169 + goto failed; 170 + if (type != 0xffff) 171 + goto failed; 172 + if (strncmp("Structured Binary Format, Softing GmbH" , dat, len)) { 173 + ret = -EINVAL; 174 + goto failed; 175 + } 176 + /* ok, we had a header */ 177 + while (mem < end) { 178 + ret = fw_parse(&mem, &type, &addr, &len, &dat); 179 + if (ret < 0) 180 + goto failed; 181 + if (type == 3) { 182 + /* start address, not used here */ 183 + continue; 184 + } else if (type == 1) { 185 + /* eof */ 186 + type_end = 1; 187 + break; 188 + } else if (type != 0) { 189 + ret = -EINVAL; 190 + goto failed; 191 + } 192 + 193 + if ((addr + len + offset) > size) 194 + goto failed; 195 + memcpy_toio(&dpram[addr + offset], dat, len); 196 + /* be sure to flush caches from IO space */ 197 + mb(); 198 + if (len > buflen) { 199 + /* align buflen */ 200 + buflen = (len + (1024-1)) & ~(1024-1); 201 + buf = krealloc(buf, buflen, GFP_KERNEL); 202 + if (!buf) { 203 + ret = -ENOMEM; 204 + goto failed; 205 + } 206 + } 207 + /* verify record data */ 208 + memcpy_fromio(buf, &dpram[addr + offset], len); 209 + if (memcmp(buf, dat, len)) { 210 + /* is not ok */ 211 + dev_alert(&card->pdev->dev, "DPRAM readback failed\n"); 212 + ret = -EIO; 213 + goto failed; 214 + } 215 + } 216 + if (!type_end) 217 + /* no end record seen */ 218 + goto failed; 219 + ret = 0; 220 + failed: 221 + kfree(buf); 222 + release_firmware(fw); 223 + if (ret < 0) 224 + dev_info(&card->pdev->dev, "firmware %s failed\n", file); 225 + return ret; 226 + } 227 + 228 + int softing_load_app_fw(const char *file, struct softing *card) 229 + { 230 + const struct firmware *fw; 231 + const uint8_t *mem, *end, *dat; 232 + int ret, j; 233 + uint16_t type, len; 234 + uint32_t addr, start_addr = 0; 235 + unsigned int sum, rx_sum; 236 + int8_t type_end = 0, type_entrypoint = 0; 237 + 238 + ret = request_firmware(&fw, file, &card->pdev->dev); 239 + if (ret) { 240 + dev_alert(&card->pdev->dev, "request_firmware(%s) got %i\n", 241 + file, ret); 242 + return ret; 243 + } 244 + dev_dbg(&card->pdev->dev, "firmware(%s) got %lu bytes\n", 245 + file, (unsigned long)fw->size); 246 + /* parse the firmware */ 247 + mem = fw->data; 248 + end = &mem[fw->size]; 249 + /* look for header record */ 250 + ret = fw_parse(&mem, &type, &addr, &len, &dat); 251 + if (ret) 252 + goto failed; 253 + ret = -EINVAL; 254 + if (type != 0xffff) { 255 + dev_alert(&card->pdev->dev, "firmware starts with type 0x%x\n", 256 + type); 257 + goto failed; 258 + } 259 + if (strncmp("Structured Binary Format, Softing GmbH", dat, len)) { 260 + dev_alert(&card->pdev->dev, "firmware string '%.*s' fault\n", 261 + len, dat); 262 + goto failed; 263 + } 264 + /* ok, we had a header */ 265 + while (mem < end) { 266 + ret = fw_parse(&mem, &type, &addr, &len, &dat); 267 + if (ret) 268 + goto failed; 269 + 270 + if (type == 3) { 271 + /* start address */ 272 + start_addr = addr; 273 + type_entrypoint = 1; 274 + continue; 275 + } else if (type == 1) { 276 + /* eof */ 277 + type_end = 1; 278 + break; 279 + } else if (type != 0) { 280 + dev_alert(&card->pdev->dev, 281 + "unknown record type 0x%04x\n", type); 282 + ret = -EINVAL; 283 + goto failed; 284 + } 285 + 286 + /* regualar data */ 287 + for (sum = 0, j = 0; j < len; ++j) 288 + sum += dat[j]; 289 + /* work in 16bit (target) */ 290 + sum &= 0xffff; 291 + 292 + memcpy_toio(&card->dpram[card->pdat->app.offs], dat, len); 293 + iowrite32(card->pdat->app.offs + card->pdat->app.addr, 294 + &card->dpram[DPRAM_COMMAND + 2]); 295 + iowrite32(addr, &card->dpram[DPRAM_COMMAND + 6]); 296 + iowrite16(len, &card->dpram[DPRAM_COMMAND + 10]); 297 + iowrite8(1, &card->dpram[DPRAM_COMMAND + 12]); 298 + ret = softing_bootloader_command(card, 1, "loading app."); 299 + if (ret < 0) 300 + goto failed; 301 + /* verify checksum */ 302 + rx_sum = ioread16(&card->dpram[DPRAM_RECEIPT + 2]); 303 + if (rx_sum != sum) { 304 + dev_alert(&card->pdev->dev, "SRAM seems to be damaged" 305 + ", wanted 0x%04x, got 0x%04x\n", sum, rx_sum); 306 + ret = -EIO; 307 + goto failed; 308 + } 309 + } 310 + if (!type_end || !type_entrypoint) 311 + goto failed; 312 + /* start application in card */ 313 + iowrite32(start_addr, &card->dpram[DPRAM_COMMAND + 2]); 314 + iowrite8(1, &card->dpram[DPRAM_COMMAND + 6]); 315 + ret = softing_bootloader_command(card, 3, "start app."); 316 + if (ret < 0) 317 + goto failed; 318 + ret = 0; 319 + failed: 320 + release_firmware(fw); 321 + if (ret < 0) 322 + dev_info(&card->pdev->dev, "firmware %s failed\n", file); 323 + return ret; 324 + } 325 + 326 + static int softing_reset_chip(struct softing *card) 327 + { 328 + int ret; 329 + 330 + do { 331 + /* reset chip */ 332 + iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO]); 333 + iowrite8(0, &card->dpram[DPRAM_RESET_RX_FIFO+1]); 334 + iowrite8(1, &card->dpram[DPRAM_RESET]); 335 + iowrite8(0, &card->dpram[DPRAM_RESET+1]); 336 + 337 + ret = softing_fct_cmd(card, 0, "reset_can"); 338 + if (!ret) 339 + break; 340 + if (signal_pending(current)) 341 + /* don't wait any longer */ 342 + break; 343 + } while (1); 344 + card->tx.pending = 0; 345 + return ret; 346 + } 347 + 348 + int softing_chip_poweron(struct softing *card) 349 + { 350 + int ret; 351 + /* sync */ 352 + ret = _softing_fct_cmd(card, 99, 0x55, "sync-a"); 353 + if (ret < 0) 354 + goto failed; 355 + 356 + ret = _softing_fct_cmd(card, 99, 0xaa, "sync-b"); 357 + if (ret < 0) 358 + goto failed; 359 + 360 + ret = softing_reset_chip(card); 361 + if (ret < 0) 362 + goto failed; 363 + /* get_serial */ 364 + ret = softing_fct_cmd(card, 43, "get_serial_number"); 365 + if (ret < 0) 366 + goto failed; 367 + card->id.serial = ioread32(&card->dpram[DPRAM_FCT_PARAM]); 368 + /* get_version */ 369 + ret = softing_fct_cmd(card, 12, "get_version"); 370 + if (ret < 0) 371 + goto failed; 372 + card->id.fw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 2]); 373 + card->id.hw_version = ioread16(&card->dpram[DPRAM_FCT_PARAM + 4]); 374 + card->id.license = ioread16(&card->dpram[DPRAM_FCT_PARAM + 6]); 375 + card->id.chip[0] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 8]); 376 + card->id.chip[1] = ioread16(&card->dpram[DPRAM_FCT_PARAM + 10]); 377 + return 0; 378 + failed: 379 + return ret; 380 + } 381 + 382 + static void softing_initialize_timestamp(struct softing *card) 383 + { 384 + uint64_t ovf; 385 + 386 + card->ts_ref = ktime_get(); 387 + 388 + /* 16MHz is the reference */ 389 + ovf = 0x100000000ULL * 16; 390 + do_div(ovf, card->pdat->freq ?: 16); 391 + 392 + card->ts_overflow = ktime_add_us(ktime_set(0, 0), ovf); 393 + } 394 + 395 + ktime_t softing_raw2ktime(struct softing *card, u32 raw) 396 + { 397 + uint64_t rawl; 398 + ktime_t now, real_offset; 399 + ktime_t target; 400 + ktime_t tmp; 401 + 402 + now = ktime_get(); 403 + real_offset = ktime_sub(ktime_get_real(), now); 404 + 405 + /* find nsec from card */ 406 + rawl = raw * 16; 407 + do_div(rawl, card->pdat->freq ?: 16); 408 + target = ktime_add_us(card->ts_ref, rawl); 409 + /* test for overflows */ 410 + tmp = ktime_add(target, card->ts_overflow); 411 + while (unlikely(ktime_to_ns(tmp) > ktime_to_ns(now))) { 412 + card->ts_ref = ktime_add(card->ts_ref, card->ts_overflow); 413 + target = tmp; 414 + tmp = ktime_add(target, card->ts_overflow); 415 + } 416 + return ktime_add(target, real_offset); 417 + } 418 + 419 + static inline int softing_error_reporting(struct net_device *netdev) 420 + { 421 + struct softing_priv *priv = netdev_priv(netdev); 422 + 423 + return (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) 424 + ? 1 : 0; 425 + } 426 + 427 + int softing_startstop(struct net_device *dev, int up) 428 + { 429 + int ret; 430 + struct softing *card; 431 + struct softing_priv *priv; 432 + struct net_device *netdev; 433 + int bus_bitmask_start; 434 + int j, error_reporting; 435 + struct can_frame msg; 436 + const struct can_bittiming *bt; 437 + 438 + priv = netdev_priv(dev); 439 + card = priv->card; 440 + 441 + if (!card->fw.up) 442 + return -EIO; 443 + 444 + ret = mutex_lock_interruptible(&card->fw.lock); 445 + if (ret) 446 + return ret; 447 + 448 + bus_bitmask_start = 0; 449 + if (dev && up) 450 + /* prepare to start this bus as well */ 451 + bus_bitmask_start |= (1 << priv->index); 452 + /* bring netdevs down */ 453 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 454 + netdev = card->net[j]; 455 + if (!netdev) 456 + continue; 457 + priv = netdev_priv(netdev); 458 + 459 + if (dev != netdev) 460 + netif_stop_queue(netdev); 461 + 462 + if (netif_running(netdev)) { 463 + if (dev != netdev) 464 + bus_bitmask_start |= (1 << j); 465 + priv->tx.pending = 0; 466 + priv->tx.echo_put = 0; 467 + priv->tx.echo_get = 0; 468 + /* 469 + * this bus' may just have called open_candev() 470 + * which is rather stupid to call close_candev() 471 + * already 472 + * but we may come here from busoff recovery too 473 + * in which case the echo_skb _needs_ flushing too. 474 + * just be sure to call open_candev() again 475 + */ 476 + close_candev(netdev); 477 + } 478 + priv->can.state = CAN_STATE_STOPPED; 479 + } 480 + card->tx.pending = 0; 481 + 482 + softing_enable_irq(card, 0); 483 + ret = softing_reset_chip(card); 484 + if (ret) 485 + goto failed; 486 + if (!bus_bitmask_start) 487 + /* no busses to be brought up */ 488 + goto card_done; 489 + 490 + if ((bus_bitmask_start & 1) && (bus_bitmask_start & 2) 491 + && (softing_error_reporting(card->net[0]) 492 + != softing_error_reporting(card->net[1]))) { 493 + dev_alert(&card->pdev->dev, 494 + "err_reporting flag differs for busses\n"); 495 + goto invalid; 496 + } 497 + error_reporting = 0; 498 + if (bus_bitmask_start & 1) { 499 + netdev = card->net[0]; 500 + priv = netdev_priv(netdev); 501 + error_reporting += softing_error_reporting(netdev); 502 + /* init chip 1 */ 503 + bt = &priv->can.bittiming; 504 + iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]); 505 + iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]); 506 + iowrite16(bt->phase_seg1 + bt->prop_seg, 507 + &card->dpram[DPRAM_FCT_PARAM + 6]); 508 + iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]); 509 + iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0, 510 + &card->dpram[DPRAM_FCT_PARAM + 10]); 511 + ret = softing_fct_cmd(card, 1, "initialize_chip[0]"); 512 + if (ret < 0) 513 + goto failed; 514 + /* set mode */ 515 + iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]); 516 + iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]); 517 + ret = softing_fct_cmd(card, 3, "set_mode[0]"); 518 + if (ret < 0) 519 + goto failed; 520 + /* set filter */ 521 + /* 11bit id & mask */ 522 + iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]); 523 + iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]); 524 + /* 29bit id.lo & mask.lo & id.hi & mask.hi */ 525 + iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]); 526 + iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]); 527 + iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]); 528 + iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]); 529 + ret = softing_fct_cmd(card, 7, "set_filter[0]"); 530 + if (ret < 0) 531 + goto failed; 532 + /* set output control */ 533 + iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]); 534 + ret = softing_fct_cmd(card, 5, "set_output[0]"); 535 + if (ret < 0) 536 + goto failed; 537 + } 538 + if (bus_bitmask_start & 2) { 539 + netdev = card->net[1]; 540 + priv = netdev_priv(netdev); 541 + error_reporting += softing_error_reporting(netdev); 542 + /* init chip2 */ 543 + bt = &priv->can.bittiming; 544 + iowrite16(bt->brp, &card->dpram[DPRAM_FCT_PARAM + 2]); 545 + iowrite16(bt->sjw, &card->dpram[DPRAM_FCT_PARAM + 4]); 546 + iowrite16(bt->phase_seg1 + bt->prop_seg, 547 + &card->dpram[DPRAM_FCT_PARAM + 6]); 548 + iowrite16(bt->phase_seg2, &card->dpram[DPRAM_FCT_PARAM + 8]); 549 + iowrite16((priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) ? 1 : 0, 550 + &card->dpram[DPRAM_FCT_PARAM + 10]); 551 + ret = softing_fct_cmd(card, 2, "initialize_chip[1]"); 552 + if (ret < 0) 553 + goto failed; 554 + /* set mode2 */ 555 + iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 2]); 556 + iowrite16(0, &card->dpram[DPRAM_FCT_PARAM + 4]); 557 + ret = softing_fct_cmd(card, 4, "set_mode[1]"); 558 + if (ret < 0) 559 + goto failed; 560 + /* set filter2 */ 561 + /* 11bit id & mask */ 562 + iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 2]); 563 + iowrite16(0x07ff, &card->dpram[DPRAM_FCT_PARAM + 4]); 564 + /* 29bit id.lo & mask.lo & id.hi & mask.hi */ 565 + iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 6]); 566 + iowrite16(0xffff, &card->dpram[DPRAM_FCT_PARAM + 8]); 567 + iowrite16(0x0000, &card->dpram[DPRAM_FCT_PARAM + 10]); 568 + iowrite16(0x1fff, &card->dpram[DPRAM_FCT_PARAM + 12]); 569 + ret = softing_fct_cmd(card, 8, "set_filter[1]"); 570 + if (ret < 0) 571 + goto failed; 572 + /* set output control2 */ 573 + iowrite16(priv->output, &card->dpram[DPRAM_FCT_PARAM + 2]); 574 + ret = softing_fct_cmd(card, 6, "set_output[1]"); 575 + if (ret < 0) 576 + goto failed; 577 + } 578 + /* enable_error_frame */ 579 + /* 580 + * Error reporting is switched off at the moment since 581 + * the receiving of them is not yet 100% verified 582 + * This should be enabled sooner or later 583 + * 584 + if (error_reporting) { 585 + ret = softing_fct_cmd(card, 51, "enable_error_frame"); 586 + if (ret < 0) 587 + goto failed; 588 + } 589 + */ 590 + /* initialize interface */ 591 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 2]); 592 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 4]); 593 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 6]); 594 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 8]); 595 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 10]); 596 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 12]); 597 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 14]); 598 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 16]); 599 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 18]); 600 + iowrite16(1, &card->dpram[DPRAM_FCT_PARAM + 20]); 601 + ret = softing_fct_cmd(card, 17, "initialize_interface"); 602 + if (ret < 0) 603 + goto failed; 604 + /* enable_fifo */ 605 + ret = softing_fct_cmd(card, 36, "enable_fifo"); 606 + if (ret < 0) 607 + goto failed; 608 + /* enable fifo tx ack */ 609 + ret = softing_fct_cmd(card, 13, "fifo_tx_ack[0]"); 610 + if (ret < 0) 611 + goto failed; 612 + /* enable fifo tx ack2 */ 613 + ret = softing_fct_cmd(card, 14, "fifo_tx_ack[1]"); 614 + if (ret < 0) 615 + goto failed; 616 + /* start_chip */ 617 + ret = softing_fct_cmd(card, 11, "start_chip"); 618 + if (ret < 0) 619 + goto failed; 620 + iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE]); 621 + iowrite8(0, &card->dpram[DPRAM_INFO_BUSSTATE2]); 622 + if (card->pdat->generation < 2) { 623 + iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]); 624 + /* flush the DPRAM caches */ 625 + wmb(); 626 + } 627 + 628 + softing_initialize_timestamp(card); 629 + 630 + /* 631 + * do socketcan notifications/status changes 632 + * from here, no errors should occur, or the failed: part 633 + * must be reviewed 634 + */ 635 + memset(&msg, 0, sizeof(msg)); 636 + msg.can_id = CAN_ERR_FLAG | CAN_ERR_RESTARTED; 637 + msg.can_dlc = CAN_ERR_DLC; 638 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 639 + if (!(bus_bitmask_start & (1 << j))) 640 + continue; 641 + netdev = card->net[j]; 642 + if (!netdev) 643 + continue; 644 + priv = netdev_priv(netdev); 645 + priv->can.state = CAN_STATE_ERROR_ACTIVE; 646 + open_candev(netdev); 647 + if (dev != netdev) { 648 + /* notify other busses on the restart */ 649 + softing_netdev_rx(netdev, &msg, ktime_set(0, 0)); 650 + ++priv->can.can_stats.restarts; 651 + } 652 + netif_wake_queue(netdev); 653 + } 654 + 655 + /* enable interrupts */ 656 + ret = softing_enable_irq(card, 1); 657 + if (ret) 658 + goto failed; 659 + card_done: 660 + mutex_unlock(&card->fw.lock); 661 + return 0; 662 + invalid: 663 + ret = -EINVAL; 664 + failed: 665 + softing_enable_irq(card, 0); 666 + softing_reset_chip(card); 667 + mutex_unlock(&card->fw.lock); 668 + /* bring all other interfaces down */ 669 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 670 + netdev = card->net[j]; 671 + if (!netdev) 672 + continue; 673 + dev_close(netdev); 674 + } 675 + return ret; 676 + } 677 + 678 + int softing_default_output(struct net_device *netdev) 679 + { 680 + struct softing_priv *priv = netdev_priv(netdev); 681 + struct softing *card = priv->card; 682 + 683 + switch (priv->chip) { 684 + case 1000: 685 + return (card->pdat->generation < 2) ? 0xfb : 0xfa; 686 + case 5: 687 + return 0x60; 688 + default: 689 + return 0x40; 690 + } 691 + }
+893
drivers/net/can/softing/softing_main.c
··· 1 + /* 2 + * Copyright (C) 2008-2010 3 + * 4 + * - Kurt Van Dijck, EIA Electronics 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the version 2 of the GNU General Public License 8 + * as published by the Free Software Foundation 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program; if not, write to the Free Software 17 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 + */ 19 + 20 + #include <linux/version.h> 21 + #include <linux/module.h> 22 + #include <linux/init.h> 23 + #include <linux/interrupt.h> 24 + 25 + #include "softing.h" 26 + 27 + #define TX_ECHO_SKB_MAX (((TXMAX+1)/2)-1) 28 + 29 + /* 30 + * test is a specific CAN netdev 31 + * is online (ie. up 'n running, not sleeping, not busoff 32 + */ 33 + static inline int canif_is_active(struct net_device *netdev) 34 + { 35 + struct can_priv *can = netdev_priv(netdev); 36 + 37 + if (!netif_running(netdev)) 38 + return 0; 39 + return (can->state <= CAN_STATE_ERROR_PASSIVE); 40 + } 41 + 42 + /* reset DPRAM */ 43 + static inline void softing_set_reset_dpram(struct softing *card) 44 + { 45 + if (card->pdat->generation >= 2) { 46 + spin_lock_bh(&card->spin); 47 + iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) & ~1, 48 + &card->dpram[DPRAM_V2_RESET]); 49 + spin_unlock_bh(&card->spin); 50 + } 51 + } 52 + 53 + static inline void softing_clr_reset_dpram(struct softing *card) 54 + { 55 + if (card->pdat->generation >= 2) { 56 + spin_lock_bh(&card->spin); 57 + iowrite8(ioread8(&card->dpram[DPRAM_V2_RESET]) | 1, 58 + &card->dpram[DPRAM_V2_RESET]); 59 + spin_unlock_bh(&card->spin); 60 + } 61 + } 62 + 63 + /* trigger the tx queue-ing */ 64 + static netdev_tx_t softing_netdev_start_xmit(struct sk_buff *skb, 65 + struct net_device *dev) 66 + { 67 + struct softing_priv *priv = netdev_priv(dev); 68 + struct softing *card = priv->card; 69 + int ret; 70 + uint8_t *ptr; 71 + uint8_t fifo_wr, fifo_rd; 72 + struct can_frame *cf = (struct can_frame *)skb->data; 73 + uint8_t buf[DPRAM_TX_SIZE]; 74 + 75 + if (can_dropped_invalid_skb(dev, skb)) 76 + return NETDEV_TX_OK; 77 + 78 + spin_lock(&card->spin); 79 + 80 + ret = NETDEV_TX_BUSY; 81 + if (!card->fw.up || 82 + (card->tx.pending >= TXMAX) || 83 + (priv->tx.pending >= TX_ECHO_SKB_MAX)) 84 + goto xmit_done; 85 + fifo_wr = ioread8(&card->dpram[DPRAM_TX_WR]); 86 + fifo_rd = ioread8(&card->dpram[DPRAM_TX_RD]); 87 + if (fifo_wr == fifo_rd) 88 + /* fifo full */ 89 + goto xmit_done; 90 + memset(buf, 0, sizeof(buf)); 91 + ptr = buf; 92 + *ptr = CMD_TX; 93 + if (cf->can_id & CAN_RTR_FLAG) 94 + *ptr |= CMD_RTR; 95 + if (cf->can_id & CAN_EFF_FLAG) 96 + *ptr |= CMD_XTD; 97 + if (priv->index) 98 + *ptr |= CMD_BUS2; 99 + ++ptr; 100 + *ptr++ = cf->can_dlc; 101 + *ptr++ = (cf->can_id >> 0); 102 + *ptr++ = (cf->can_id >> 8); 103 + if (cf->can_id & CAN_EFF_FLAG) { 104 + *ptr++ = (cf->can_id >> 16); 105 + *ptr++ = (cf->can_id >> 24); 106 + } else { 107 + /* increment 1, not 2 as you might think */ 108 + ptr += 1; 109 + } 110 + if (!(cf->can_id & CAN_RTR_FLAG)) 111 + memcpy(ptr, &cf->data[0], cf->can_dlc); 112 + memcpy_toio(&card->dpram[DPRAM_TX + DPRAM_TX_SIZE * fifo_wr], 113 + buf, DPRAM_TX_SIZE); 114 + if (++fifo_wr >= DPRAM_TX_CNT) 115 + fifo_wr = 0; 116 + iowrite8(fifo_wr, &card->dpram[DPRAM_TX_WR]); 117 + card->tx.last_bus = priv->index; 118 + ++card->tx.pending; 119 + ++priv->tx.pending; 120 + can_put_echo_skb(skb, dev, priv->tx.echo_put); 121 + ++priv->tx.echo_put; 122 + if (priv->tx.echo_put >= TX_ECHO_SKB_MAX) 123 + priv->tx.echo_put = 0; 124 + /* can_put_echo_skb() saves the skb, safe to return TX_OK */ 125 + ret = NETDEV_TX_OK; 126 + xmit_done: 127 + spin_unlock(&card->spin); 128 + if (card->tx.pending >= TXMAX) { 129 + int j; 130 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 131 + if (card->net[j]) 132 + netif_stop_queue(card->net[j]); 133 + } 134 + } 135 + if (ret != NETDEV_TX_OK) 136 + netif_stop_queue(dev); 137 + 138 + return ret; 139 + } 140 + 141 + /* 142 + * shortcut for skb delivery 143 + */ 144 + int softing_netdev_rx(struct net_device *netdev, const struct can_frame *msg, 145 + ktime_t ktime) 146 + { 147 + struct sk_buff *skb; 148 + struct can_frame *cf; 149 + 150 + skb = alloc_can_skb(netdev, &cf); 151 + if (!skb) 152 + return -ENOMEM; 153 + memcpy(cf, msg, sizeof(*msg)); 154 + skb->tstamp = ktime; 155 + return netif_rx(skb); 156 + } 157 + 158 + /* 159 + * softing_handle_1 160 + * pop 1 entry from the DPRAM queue, and process 161 + */ 162 + static int softing_handle_1(struct softing *card) 163 + { 164 + struct net_device *netdev; 165 + struct softing_priv *priv; 166 + ktime_t ktime; 167 + struct can_frame msg; 168 + int cnt = 0, lost_msg; 169 + uint8_t fifo_rd, fifo_wr, cmd; 170 + uint8_t *ptr; 171 + uint32_t tmp_u32; 172 + uint8_t buf[DPRAM_RX_SIZE]; 173 + 174 + memset(&msg, 0, sizeof(msg)); 175 + /* test for lost msgs */ 176 + lost_msg = ioread8(&card->dpram[DPRAM_RX_LOST]); 177 + if (lost_msg) { 178 + int j; 179 + /* reset condition */ 180 + iowrite8(0, &card->dpram[DPRAM_RX_LOST]); 181 + /* prepare msg */ 182 + msg.can_id = CAN_ERR_FLAG | CAN_ERR_CRTL; 183 + msg.can_dlc = CAN_ERR_DLC; 184 + msg.data[1] = CAN_ERR_CRTL_RX_OVERFLOW; 185 + /* 186 + * service to all busses, we don't know which it was applicable 187 + * but only service busses that are online 188 + */ 189 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 190 + netdev = card->net[j]; 191 + if (!netdev) 192 + continue; 193 + if (!canif_is_active(netdev)) 194 + /* a dead bus has no overflows */ 195 + continue; 196 + ++netdev->stats.rx_over_errors; 197 + softing_netdev_rx(netdev, &msg, ktime_set(0, 0)); 198 + } 199 + /* prepare for other use */ 200 + memset(&msg, 0, sizeof(msg)); 201 + ++cnt; 202 + } 203 + 204 + fifo_rd = ioread8(&card->dpram[DPRAM_RX_RD]); 205 + fifo_wr = ioread8(&card->dpram[DPRAM_RX_WR]); 206 + 207 + if (++fifo_rd >= DPRAM_RX_CNT) 208 + fifo_rd = 0; 209 + if (fifo_wr == fifo_rd) 210 + return cnt; 211 + 212 + memcpy_fromio(buf, &card->dpram[DPRAM_RX + DPRAM_RX_SIZE*fifo_rd], 213 + DPRAM_RX_SIZE); 214 + mb(); 215 + /* trigger dual port RAM */ 216 + iowrite8(fifo_rd, &card->dpram[DPRAM_RX_RD]); 217 + 218 + ptr = buf; 219 + cmd = *ptr++; 220 + if (cmd == 0xff) 221 + /* not quite usefull, probably the card has got out */ 222 + return 0; 223 + netdev = card->net[0]; 224 + if (cmd & CMD_BUS2) 225 + netdev = card->net[1]; 226 + priv = netdev_priv(netdev); 227 + 228 + if (cmd & CMD_ERR) { 229 + uint8_t can_state, state; 230 + 231 + state = *ptr++; 232 + 233 + msg.can_id = CAN_ERR_FLAG; 234 + msg.can_dlc = CAN_ERR_DLC; 235 + 236 + if (state & SF_MASK_BUSOFF) { 237 + can_state = CAN_STATE_BUS_OFF; 238 + msg.can_id |= CAN_ERR_BUSOFF; 239 + state = STATE_BUSOFF; 240 + } else if (state & SF_MASK_EPASSIVE) { 241 + can_state = CAN_STATE_ERROR_PASSIVE; 242 + msg.can_id |= CAN_ERR_CRTL; 243 + msg.data[1] = CAN_ERR_CRTL_TX_PASSIVE; 244 + state = STATE_EPASSIVE; 245 + } else { 246 + can_state = CAN_STATE_ERROR_ACTIVE; 247 + msg.can_id |= CAN_ERR_CRTL; 248 + state = STATE_EACTIVE; 249 + } 250 + /* update DPRAM */ 251 + iowrite8(state, &card->dpram[priv->index ? 252 + DPRAM_INFO_BUSSTATE2 : DPRAM_INFO_BUSSTATE]); 253 + /* timestamp */ 254 + tmp_u32 = le32_to_cpup((void *)ptr); 255 + ptr += 4; 256 + ktime = softing_raw2ktime(card, tmp_u32); 257 + 258 + ++netdev->stats.rx_errors; 259 + /* update internal status */ 260 + if (can_state != priv->can.state) { 261 + priv->can.state = can_state; 262 + if (can_state == CAN_STATE_ERROR_PASSIVE) 263 + ++priv->can.can_stats.error_passive; 264 + else if (can_state == CAN_STATE_BUS_OFF) { 265 + /* this calls can_close_cleanup() */ 266 + can_bus_off(netdev); 267 + netif_stop_queue(netdev); 268 + } 269 + /* trigger socketcan */ 270 + softing_netdev_rx(netdev, &msg, ktime); 271 + } 272 + 273 + } else { 274 + if (cmd & CMD_RTR) 275 + msg.can_id |= CAN_RTR_FLAG; 276 + msg.can_dlc = get_can_dlc(*ptr++); 277 + if (cmd & CMD_XTD) { 278 + msg.can_id |= CAN_EFF_FLAG; 279 + msg.can_id |= le32_to_cpup((void *)ptr); 280 + ptr += 4; 281 + } else { 282 + msg.can_id |= le16_to_cpup((void *)ptr); 283 + ptr += 2; 284 + } 285 + /* timestamp */ 286 + tmp_u32 = le32_to_cpup((void *)ptr); 287 + ptr += 4; 288 + ktime = softing_raw2ktime(card, tmp_u32); 289 + if (!(msg.can_id & CAN_RTR_FLAG)) 290 + memcpy(&msg.data[0], ptr, 8); 291 + ptr += 8; 292 + /* update socket */ 293 + if (cmd & CMD_ACK) { 294 + /* acknowledge, was tx msg */ 295 + struct sk_buff *skb; 296 + skb = priv->can.echo_skb[priv->tx.echo_get]; 297 + if (skb) 298 + skb->tstamp = ktime; 299 + can_get_echo_skb(netdev, priv->tx.echo_get); 300 + ++priv->tx.echo_get; 301 + if (priv->tx.echo_get >= TX_ECHO_SKB_MAX) 302 + priv->tx.echo_get = 0; 303 + if (priv->tx.pending) 304 + --priv->tx.pending; 305 + if (card->tx.pending) 306 + --card->tx.pending; 307 + ++netdev->stats.tx_packets; 308 + if (!(msg.can_id & CAN_RTR_FLAG)) 309 + netdev->stats.tx_bytes += msg.can_dlc; 310 + } else { 311 + int ret; 312 + 313 + ret = softing_netdev_rx(netdev, &msg, ktime); 314 + if (ret == NET_RX_SUCCESS) { 315 + ++netdev->stats.rx_packets; 316 + if (!(msg.can_id & CAN_RTR_FLAG)) 317 + netdev->stats.rx_bytes += msg.can_dlc; 318 + } else { 319 + ++netdev->stats.rx_dropped; 320 + } 321 + } 322 + } 323 + ++cnt; 324 + return cnt; 325 + } 326 + 327 + /* 328 + * real interrupt handler 329 + */ 330 + static irqreturn_t softing_irq_thread(int irq, void *dev_id) 331 + { 332 + struct softing *card = (struct softing *)dev_id; 333 + struct net_device *netdev; 334 + struct softing_priv *priv; 335 + int j, offset, work_done; 336 + 337 + work_done = 0; 338 + spin_lock_bh(&card->spin); 339 + while (softing_handle_1(card) > 0) { 340 + ++card->irq.svc_count; 341 + ++work_done; 342 + } 343 + spin_unlock_bh(&card->spin); 344 + /* resume tx queue's */ 345 + offset = card->tx.last_bus; 346 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 347 + if (card->tx.pending >= TXMAX) 348 + break; 349 + netdev = card->net[(j + offset + 1) % card->pdat->nbus]; 350 + if (!netdev) 351 + continue; 352 + priv = netdev_priv(netdev); 353 + if (!canif_is_active(netdev)) 354 + /* it makes no sense to wake dead busses */ 355 + continue; 356 + if (priv->tx.pending >= TX_ECHO_SKB_MAX) 357 + continue; 358 + ++work_done; 359 + netif_wake_queue(netdev); 360 + } 361 + return work_done ? IRQ_HANDLED : IRQ_NONE; 362 + } 363 + 364 + /* 365 + * interrupt routines: 366 + * schedule the 'real interrupt handler' 367 + */ 368 + static irqreturn_t softing_irq_v2(int irq, void *dev_id) 369 + { 370 + struct softing *card = (struct softing *)dev_id; 371 + uint8_t ir; 372 + 373 + ir = ioread8(&card->dpram[DPRAM_V2_IRQ_TOHOST]); 374 + iowrite8(0, &card->dpram[DPRAM_V2_IRQ_TOHOST]); 375 + return (1 == ir) ? IRQ_WAKE_THREAD : IRQ_NONE; 376 + } 377 + 378 + static irqreturn_t softing_irq_v1(int irq, void *dev_id) 379 + { 380 + struct softing *card = (struct softing *)dev_id; 381 + uint8_t ir; 382 + 383 + ir = ioread8(&card->dpram[DPRAM_IRQ_TOHOST]); 384 + iowrite8(0, &card->dpram[DPRAM_IRQ_TOHOST]); 385 + return ir ? IRQ_WAKE_THREAD : IRQ_NONE; 386 + } 387 + 388 + /* 389 + * netdev/candev inter-operability 390 + */ 391 + static int softing_netdev_open(struct net_device *ndev) 392 + { 393 + int ret; 394 + 395 + /* check or determine and set bittime */ 396 + ret = open_candev(ndev); 397 + if (!ret) 398 + ret = softing_startstop(ndev, 1); 399 + return ret; 400 + } 401 + 402 + static int softing_netdev_stop(struct net_device *ndev) 403 + { 404 + int ret; 405 + 406 + netif_stop_queue(ndev); 407 + 408 + /* softing cycle does close_candev() */ 409 + ret = softing_startstop(ndev, 0); 410 + return ret; 411 + } 412 + 413 + static int softing_candev_set_mode(struct net_device *ndev, enum can_mode mode) 414 + { 415 + int ret; 416 + 417 + switch (mode) { 418 + case CAN_MODE_START: 419 + /* softing_startstop does close_candev() */ 420 + ret = softing_startstop(ndev, 1); 421 + return ret; 422 + case CAN_MODE_STOP: 423 + case CAN_MODE_SLEEP: 424 + return -EOPNOTSUPP; 425 + } 426 + return 0; 427 + } 428 + 429 + /* 430 + * Softing device management helpers 431 + */ 432 + int softing_enable_irq(struct softing *card, int enable) 433 + { 434 + int ret; 435 + 436 + if (!card->irq.nr) { 437 + return 0; 438 + } else if (card->irq.requested && !enable) { 439 + free_irq(card->irq.nr, card); 440 + card->irq.requested = 0; 441 + } else if (!card->irq.requested && enable) { 442 + ret = request_threaded_irq(card->irq.nr, 443 + (card->pdat->generation >= 2) ? 444 + softing_irq_v2 : softing_irq_v1, 445 + softing_irq_thread, IRQF_SHARED, 446 + dev_name(&card->pdev->dev), card); 447 + if (ret) { 448 + dev_alert(&card->pdev->dev, 449 + "request_threaded_irq(%u) failed\n", 450 + card->irq.nr); 451 + return ret; 452 + } 453 + card->irq.requested = 1; 454 + } 455 + return 0; 456 + } 457 + 458 + static void softing_card_shutdown(struct softing *card) 459 + { 460 + int fw_up = 0; 461 + 462 + if (mutex_lock_interruptible(&card->fw.lock)) 463 + /* return -ERESTARTSYS */; 464 + fw_up = card->fw.up; 465 + card->fw.up = 0; 466 + 467 + if (card->irq.requested && card->irq.nr) { 468 + free_irq(card->irq.nr, card); 469 + card->irq.requested = 0; 470 + } 471 + if (fw_up) { 472 + if (card->pdat->enable_irq) 473 + card->pdat->enable_irq(card->pdev, 0); 474 + softing_set_reset_dpram(card); 475 + if (card->pdat->reset) 476 + card->pdat->reset(card->pdev, 1); 477 + } 478 + mutex_unlock(&card->fw.lock); 479 + } 480 + 481 + static __devinit int softing_card_boot(struct softing *card) 482 + { 483 + int ret, j; 484 + static const uint8_t stream[] = { 485 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, }; 486 + unsigned char back[sizeof(stream)]; 487 + 488 + if (mutex_lock_interruptible(&card->fw.lock)) 489 + return -ERESTARTSYS; 490 + if (card->fw.up) { 491 + mutex_unlock(&card->fw.lock); 492 + return 0; 493 + } 494 + /* reset board */ 495 + if (card->pdat->enable_irq) 496 + card->pdat->enable_irq(card->pdev, 1); 497 + /* boot card */ 498 + softing_set_reset_dpram(card); 499 + if (card->pdat->reset) 500 + card->pdat->reset(card->pdev, 1); 501 + for (j = 0; (j + sizeof(stream)) < card->dpram_size; 502 + j += sizeof(stream)) { 503 + 504 + memcpy_toio(&card->dpram[j], stream, sizeof(stream)); 505 + /* flush IO cache */ 506 + mb(); 507 + memcpy_fromio(back, &card->dpram[j], sizeof(stream)); 508 + 509 + if (!memcmp(back, stream, sizeof(stream))) 510 + continue; 511 + /* memory is not equal */ 512 + dev_alert(&card->pdev->dev, "dpram failed at 0x%04x\n", j); 513 + ret = -EIO; 514 + goto failed; 515 + } 516 + wmb(); 517 + /* load boot firmware */ 518 + ret = softing_load_fw(card->pdat->boot.fw, card, card->dpram, 519 + card->dpram_size, 520 + card->pdat->boot.offs - card->pdat->boot.addr); 521 + if (ret < 0) 522 + goto failed; 523 + /* load loader firmware */ 524 + ret = softing_load_fw(card->pdat->load.fw, card, card->dpram, 525 + card->dpram_size, 526 + card->pdat->load.offs - card->pdat->load.addr); 527 + if (ret < 0) 528 + goto failed; 529 + 530 + if (card->pdat->reset) 531 + card->pdat->reset(card->pdev, 0); 532 + softing_clr_reset_dpram(card); 533 + ret = softing_bootloader_command(card, 0, "card boot"); 534 + if (ret < 0) 535 + goto failed; 536 + ret = softing_load_app_fw(card->pdat->app.fw, card); 537 + if (ret < 0) 538 + goto failed; 539 + 540 + ret = softing_chip_poweron(card); 541 + if (ret < 0) 542 + goto failed; 543 + 544 + card->fw.up = 1; 545 + mutex_unlock(&card->fw.lock); 546 + return 0; 547 + failed: 548 + card->fw.up = 0; 549 + if (card->pdat->enable_irq) 550 + card->pdat->enable_irq(card->pdev, 0); 551 + softing_set_reset_dpram(card); 552 + if (card->pdat->reset) 553 + card->pdat->reset(card->pdev, 1); 554 + mutex_unlock(&card->fw.lock); 555 + return ret; 556 + } 557 + 558 + /* 559 + * netdev sysfs 560 + */ 561 + static ssize_t show_channel(struct device *dev, struct device_attribute *attr, 562 + char *buf) 563 + { 564 + struct net_device *ndev = to_net_dev(dev); 565 + struct softing_priv *priv = netdev2softing(ndev); 566 + 567 + return sprintf(buf, "%i\n", priv->index); 568 + } 569 + 570 + static ssize_t show_chip(struct device *dev, struct device_attribute *attr, 571 + char *buf) 572 + { 573 + struct net_device *ndev = to_net_dev(dev); 574 + struct softing_priv *priv = netdev2softing(ndev); 575 + 576 + return sprintf(buf, "%i\n", priv->chip); 577 + } 578 + 579 + static ssize_t show_output(struct device *dev, struct device_attribute *attr, 580 + char *buf) 581 + { 582 + struct net_device *ndev = to_net_dev(dev); 583 + struct softing_priv *priv = netdev2softing(ndev); 584 + 585 + return sprintf(buf, "0x%02x\n", priv->output); 586 + } 587 + 588 + static ssize_t store_output(struct device *dev, struct device_attribute *attr, 589 + const char *buf, size_t count) 590 + { 591 + struct net_device *ndev = to_net_dev(dev); 592 + struct softing_priv *priv = netdev2softing(ndev); 593 + struct softing *card = priv->card; 594 + unsigned long val; 595 + int ret; 596 + 597 + ret = strict_strtoul(buf, 0, &val); 598 + if (ret < 0) 599 + return ret; 600 + val &= 0xFF; 601 + 602 + ret = mutex_lock_interruptible(&card->fw.lock); 603 + if (ret) 604 + return -ERESTARTSYS; 605 + if (netif_running(ndev)) { 606 + mutex_unlock(&card->fw.lock); 607 + return -EBUSY; 608 + } 609 + priv->output = val; 610 + mutex_unlock(&card->fw.lock); 611 + return count; 612 + } 613 + 614 + static const DEVICE_ATTR(channel, S_IRUGO, show_channel, NULL); 615 + static const DEVICE_ATTR(chip, S_IRUGO, show_chip, NULL); 616 + static const DEVICE_ATTR(output, S_IRUGO | S_IWUSR, show_output, store_output); 617 + 618 + static const struct attribute *const netdev_sysfs_attrs[] = { 619 + &dev_attr_channel.attr, 620 + &dev_attr_chip.attr, 621 + &dev_attr_output.attr, 622 + NULL, 623 + }; 624 + static const struct attribute_group netdev_sysfs_group = { 625 + .name = NULL, 626 + .attrs = (struct attribute **)netdev_sysfs_attrs, 627 + }; 628 + 629 + static const struct net_device_ops softing_netdev_ops = { 630 + .ndo_open = softing_netdev_open, 631 + .ndo_stop = softing_netdev_stop, 632 + .ndo_start_xmit = softing_netdev_start_xmit, 633 + }; 634 + 635 + static const struct can_bittiming_const softing_btr_const = { 636 + .tseg1_min = 1, 637 + .tseg1_max = 16, 638 + .tseg2_min = 1, 639 + .tseg2_max = 8, 640 + .sjw_max = 4, /* overruled */ 641 + .brp_min = 1, 642 + .brp_max = 32, /* overruled */ 643 + .brp_inc = 1, 644 + }; 645 + 646 + 647 + static __devinit struct net_device *softing_netdev_create(struct softing *card, 648 + uint16_t chip_id) 649 + { 650 + struct net_device *netdev; 651 + struct softing_priv *priv; 652 + 653 + netdev = alloc_candev(sizeof(*priv), TX_ECHO_SKB_MAX); 654 + if (!netdev) { 655 + dev_alert(&card->pdev->dev, "alloc_candev failed\n"); 656 + return NULL; 657 + } 658 + priv = netdev_priv(netdev); 659 + priv->netdev = netdev; 660 + priv->card = card; 661 + memcpy(&priv->btr_const, &softing_btr_const, sizeof(priv->btr_const)); 662 + priv->btr_const.brp_max = card->pdat->max_brp; 663 + priv->btr_const.sjw_max = card->pdat->max_sjw; 664 + priv->can.bittiming_const = &priv->btr_const; 665 + priv->can.clock.freq = 8000000; 666 + priv->chip = chip_id; 667 + priv->output = softing_default_output(netdev); 668 + SET_NETDEV_DEV(netdev, &card->pdev->dev); 669 + 670 + netdev->flags |= IFF_ECHO; 671 + netdev->netdev_ops = &softing_netdev_ops; 672 + priv->can.do_set_mode = softing_candev_set_mode; 673 + priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; 674 + 675 + return netdev; 676 + } 677 + 678 + static __devinit int softing_netdev_register(struct net_device *netdev) 679 + { 680 + int ret; 681 + 682 + netdev->sysfs_groups[0] = &netdev_sysfs_group; 683 + ret = register_candev(netdev); 684 + if (ret) { 685 + dev_alert(&netdev->dev, "register failed\n"); 686 + return ret; 687 + } 688 + return 0; 689 + } 690 + 691 + static void softing_netdev_cleanup(struct net_device *netdev) 692 + { 693 + unregister_candev(netdev); 694 + free_candev(netdev); 695 + } 696 + 697 + /* 698 + * sysfs for Platform device 699 + */ 700 + #define DEV_ATTR_RO(name, member) \ 701 + static ssize_t show_##name(struct device *dev, \ 702 + struct device_attribute *attr, char *buf) \ 703 + { \ 704 + struct softing *card = platform_get_drvdata(to_platform_device(dev)); \ 705 + return sprintf(buf, "%u\n", card->member); \ 706 + } \ 707 + static DEVICE_ATTR(name, 0444, show_##name, NULL) 708 + 709 + #define DEV_ATTR_RO_STR(name, member) \ 710 + static ssize_t show_##name(struct device *dev, \ 711 + struct device_attribute *attr, char *buf) \ 712 + { \ 713 + struct softing *card = platform_get_drvdata(to_platform_device(dev)); \ 714 + return sprintf(buf, "%s\n", card->member); \ 715 + } \ 716 + static DEVICE_ATTR(name, 0444, show_##name, NULL) 717 + 718 + DEV_ATTR_RO(serial, id.serial); 719 + DEV_ATTR_RO_STR(firmware, pdat->app.fw); 720 + DEV_ATTR_RO(firmware_version, id.fw_version); 721 + DEV_ATTR_RO_STR(hardware, pdat->name); 722 + DEV_ATTR_RO(hardware_version, id.hw_version); 723 + DEV_ATTR_RO(license, id.license); 724 + DEV_ATTR_RO(frequency, id.freq); 725 + DEV_ATTR_RO(txpending, tx.pending); 726 + 727 + static struct attribute *softing_pdev_attrs[] = { 728 + &dev_attr_serial.attr, 729 + &dev_attr_firmware.attr, 730 + &dev_attr_firmware_version.attr, 731 + &dev_attr_hardware.attr, 732 + &dev_attr_hardware_version.attr, 733 + &dev_attr_license.attr, 734 + &dev_attr_frequency.attr, 735 + &dev_attr_txpending.attr, 736 + NULL, 737 + }; 738 + 739 + static const struct attribute_group softing_pdev_group = { 740 + .name = NULL, 741 + .attrs = softing_pdev_attrs, 742 + }; 743 + 744 + /* 745 + * platform driver 746 + */ 747 + static __devexit int softing_pdev_remove(struct platform_device *pdev) 748 + { 749 + struct softing *card = platform_get_drvdata(pdev); 750 + int j; 751 + 752 + /* first, disable card*/ 753 + softing_card_shutdown(card); 754 + 755 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 756 + if (!card->net[j]) 757 + continue; 758 + softing_netdev_cleanup(card->net[j]); 759 + card->net[j] = NULL; 760 + } 761 + sysfs_remove_group(&pdev->dev.kobj, &softing_pdev_group); 762 + 763 + iounmap(card->dpram); 764 + kfree(card); 765 + return 0; 766 + } 767 + 768 + static __devinit int softing_pdev_probe(struct platform_device *pdev) 769 + { 770 + const struct softing_platform_data *pdat = pdev->dev.platform_data; 771 + struct softing *card; 772 + struct net_device *netdev; 773 + struct softing_priv *priv; 774 + struct resource *pres; 775 + int ret; 776 + int j; 777 + 778 + if (!pdat) { 779 + dev_warn(&pdev->dev, "no platform data\n"); 780 + return -EINVAL; 781 + } 782 + if (pdat->nbus > ARRAY_SIZE(card->net)) { 783 + dev_warn(&pdev->dev, "%u nets??\n", pdat->nbus); 784 + return -EINVAL; 785 + } 786 + 787 + card = kzalloc(sizeof(*card), GFP_KERNEL); 788 + if (!card) 789 + return -ENOMEM; 790 + card->pdat = pdat; 791 + card->pdev = pdev; 792 + platform_set_drvdata(pdev, card); 793 + mutex_init(&card->fw.lock); 794 + spin_lock_init(&card->spin); 795 + 796 + ret = -EINVAL; 797 + pres = platform_get_resource(pdev, IORESOURCE_MEM, 0); 798 + if (!pres) 799 + goto platform_resource_failed;; 800 + card->dpram_phys = pres->start; 801 + card->dpram_size = pres->end - pres->start + 1; 802 + card->dpram = ioremap_nocache(card->dpram_phys, card->dpram_size); 803 + if (!card->dpram) { 804 + dev_alert(&card->pdev->dev, "dpram ioremap failed\n"); 805 + goto ioremap_failed; 806 + } 807 + 808 + pres = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 809 + if (pres) 810 + card->irq.nr = pres->start; 811 + 812 + /* reset card */ 813 + ret = softing_card_boot(card); 814 + if (ret < 0) { 815 + dev_alert(&pdev->dev, "failed to boot\n"); 816 + goto boot_failed; 817 + } 818 + 819 + /* only now, the chip's are known */ 820 + card->id.freq = card->pdat->freq; 821 + 822 + ret = sysfs_create_group(&pdev->dev.kobj, &softing_pdev_group); 823 + if (ret < 0) { 824 + dev_alert(&card->pdev->dev, "sysfs failed\n"); 825 + goto sysfs_failed; 826 + } 827 + 828 + ret = -ENOMEM; 829 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 830 + card->net[j] = netdev = 831 + softing_netdev_create(card, card->id.chip[j]); 832 + if (!netdev) { 833 + dev_alert(&pdev->dev, "failed to make can[%i]", j); 834 + goto netdev_failed; 835 + } 836 + priv = netdev_priv(card->net[j]); 837 + priv->index = j; 838 + ret = softing_netdev_register(netdev); 839 + if (ret) { 840 + free_candev(netdev); 841 + card->net[j] = NULL; 842 + dev_alert(&card->pdev->dev, 843 + "failed to register can[%i]\n", j); 844 + goto netdev_failed; 845 + } 846 + } 847 + dev_info(&card->pdev->dev, "%s ready.\n", card->pdat->name); 848 + return 0; 849 + 850 + netdev_failed: 851 + for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 852 + if (!card->net[j]) 853 + continue; 854 + softing_netdev_cleanup(card->net[j]); 855 + } 856 + sysfs_remove_group(&pdev->dev.kobj, &softing_pdev_group); 857 + sysfs_failed: 858 + softing_card_shutdown(card); 859 + boot_failed: 860 + iounmap(card->dpram); 861 + ioremap_failed: 862 + platform_resource_failed: 863 + kfree(card); 864 + return ret; 865 + } 866 + 867 + static struct platform_driver softing_driver = { 868 + .driver = { 869 + .name = "softing", 870 + .owner = THIS_MODULE, 871 + }, 872 + .probe = softing_pdev_probe, 873 + .remove = __devexit_p(softing_pdev_remove), 874 + }; 875 + 876 + MODULE_ALIAS("platform:softing"); 877 + 878 + static int __init softing_start(void) 879 + { 880 + return platform_driver_register(&softing_driver); 881 + } 882 + 883 + static void __exit softing_stop(void) 884 + { 885 + platform_driver_unregister(&softing_driver); 886 + } 887 + 888 + module_init(softing_start); 889 + module_exit(softing_stop); 890 + 891 + MODULE_DESCRIPTION("Softing DPRAM CAN driver"); 892 + MODULE_AUTHOR("Kurt Van Dijck <kurt.van.dijck@eia.be>"); 893 + MODULE_LICENSE("GPL v2");
+40
drivers/net/can/softing/softing_platform.h
··· 1 + 2 + #include <linux/platform_device.h> 3 + 4 + #ifndef _SOFTING_DEVICE_H_ 5 + #define _SOFTING_DEVICE_H_ 6 + 7 + /* softing firmware directory prefix */ 8 + #define fw_dir "softing-4.6/" 9 + 10 + struct softing_platform_data { 11 + unsigned int manf; 12 + unsigned int prod; 13 + /* 14 + * generation 15 + * 1st with NEC or SJA1000 16 + * 8bit, exclusive interrupt, ... 17 + * 2nd only SJA1000 18 + * 16bit, shared interrupt 19 + */ 20 + int generation; 21 + int nbus; /* # busses on device */ 22 + unsigned int freq; /* operating frequency in Hz */ 23 + unsigned int max_brp; 24 + unsigned int max_sjw; 25 + unsigned long dpram_size; 26 + const char *name; 27 + struct { 28 + unsigned long offs; 29 + unsigned long addr; 30 + const char *fw; 31 + } boot, load, app; 32 + /* 33 + * reset() function 34 + * bring pdev in or out of reset, depending on value 35 + */ 36 + int (*reset)(struct platform_device *pdev, int value); 37 + int (*enable_irq)(struct platform_device *pdev, int value); 38 + }; 39 + 40 + #endif