solos: Remove superfluous wait_queue_head_t from struct solos_param
[linux-2.6] / drivers / atm / solos-pci.c
1 /*
2  * Driver for the Solos PCI ADSL2+ card, designed to support Linux by
3  *  Traverse Technologies -- http://www.traverse.com.au/
4  *  Xrio Limited          -- http://www.xrio.com/
5  *
6  *
7  * Copyright © 2008 Traverse Technologies
8  * Copyright © 2008 Intel Corporation
9  *
10  * Authors: Nathan Williams <nathan@traverse.com.au>
11  *          David Woodhouse <dwmw2@infradead.org>
12  *          Treker Chen <treker@xrio.com>
13  *
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * version 2, as published by the Free Software Foundation.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  */
23
24 #define DEBUG
25 #define VERBOSE_DEBUG
26
27 #include <linux/interrupt.h>
28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/errno.h>
31 #include <linux/ioport.h>
32 #include <linux/types.h>
33 #include <linux/pci.h>
34 #include <linux/atm.h>
35 #include <linux/atmdev.h>
36 #include <linux/skbuff.h>
37 #include <linux/sysfs.h>
38 #include <linux/device.h>
39 #include <linux/kobject.h>
40 #include <linux/firmware.h>
41 #include <linux/ctype.h>
42 #include <linux/swab.h>
43
44 #define VERSION "0.07"
45 #define PTAG "solos-pci"
46
47 #define CONFIG_RAM_SIZE 128
48 #define FLAGS_ADDR      0x7C
49 #define IRQ_EN_ADDR     0x78
50 #define FPGA_VER        0x74
51 #define IRQ_CLEAR       0x70
52 #define WRITE_FLASH     0x6C
53 #define PORTS           0x68
54 #define FLASH_BLOCK     0x64
55 #define FLASH_BUSY      0x60
56 #define FPGA_MODE       0x5C
57 #define FLASH_MODE      0x58
58 #define TX_DMA_ADDR(port)       (0x40 + (4 * (port)))
59 #define RX_DMA_ADDR(port)       (0x30 + (4 * (port)))
60
61 #define DATA_RAM_SIZE   32768
62 #define BUF_SIZE        4096
63 #define FPGA_PAGE       528 /* FPGA flash page size*/
64 #define SOLOS_PAGE      512 /* Solos flash page size*/
65 #define FPGA_BLOCK      (FPGA_PAGE * 8) /* FPGA flash block size*/
66 #define SOLOS_BLOCK     (SOLOS_PAGE * 8) /* Solos flash block size*/
67
68 #define RX_BUF(card, nr) ((card->buffers) + (nr)*BUF_SIZE*2)
69 #define TX_BUF(card, nr) ((card->buffers) + (nr)*BUF_SIZE*2 + BUF_SIZE)
70
71 #define RX_DMA_SIZE     2048
72
73 static int atmdebug = 0;
74 static int firmware_upgrade = 0;
75 static int fpga_upgrade = 0;
76
77 struct pkt_hdr {
78         __le16 size;
79         __le16 vpi;
80         __le16 vci;
81         __le16 type;
82 };
83
84 struct solos_skb_cb {
85         struct atm_vcc *vcc;
86         uint32_t dma_addr;
87 };
88
89
90 #define SKB_CB(skb)             ((struct solos_skb_cb *)skb->cb)
91
92 #define PKT_DATA        0
93 #define PKT_COMMAND     1
94 #define PKT_POPEN       3
95 #define PKT_PCLOSE      4
96 #define PKT_STATUS      5
97
98 struct solos_card {
99         void __iomem *config_regs;
100         void __iomem *buffers;
101         int nr_ports;
102         int tx_mask;
103         struct pci_dev *dev;
104         struct atm_dev *atmdev[4];
105         struct tasklet_struct tlet;
106         spinlock_t tx_lock;
107         spinlock_t tx_queue_lock;
108         spinlock_t cli_queue_lock;
109         spinlock_t param_queue_lock;
110         struct list_head param_queue;
111         struct sk_buff_head tx_queue[4];
112         struct sk_buff_head cli_queue[4];
113         struct sk_buff *tx_skb[4];
114         struct sk_buff *rx_skb[4];
115         wait_queue_head_t param_wq;
116         wait_queue_head_t fw_wq;
117         int using_dma;
118 };
119
120
121 struct solos_param {
122         struct list_head list;
123         pid_t pid;
124         int port;
125         struct sk_buff *response;
126 };
127
128 #define SOLOS_CHAN(atmdev) ((int)(unsigned long)(atmdev)->phy_data)
129
130 MODULE_AUTHOR("Traverse Technologies <support@traverse.com.au>");
131 MODULE_DESCRIPTION("Solos PCI driver");
132 MODULE_VERSION(VERSION);
133 MODULE_LICENSE("GPL");
134 MODULE_PARM_DESC(atmdebug, "Print ATM data");
135 MODULE_PARM_DESC(firmware_upgrade, "Initiate Solos firmware upgrade");
136 MODULE_PARM_DESC(fpga_upgrade, "Initiate FPGA upgrade");
137 module_param(atmdebug, int, 0644);
138 module_param(firmware_upgrade, int, 0444);
139 module_param(fpga_upgrade, int, 0444);
140
141 static void fpga_queue(struct solos_card *card, int port, struct sk_buff *skb,
142                        struct atm_vcc *vcc);
143 static int fpga_tx(struct solos_card *);
144 static irqreturn_t solos_irq(int irq, void *dev_id);
145 static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci);
146 static int list_vccs(int vci);
147 static void release_vccs(struct atm_dev *dev);
148 static int atm_init(struct solos_card *);
149 static void atm_remove(struct solos_card *);
150 static int send_command(struct solos_card *card, int dev, const char *buf, size_t size);
151 static void solos_bh(unsigned long);
152 static int print_buffer(struct sk_buff *buf);
153
154 static inline void solos_pop(struct atm_vcc *vcc, struct sk_buff *skb)
155 {
156         if (vcc->pop)
157                 vcc->pop(vcc, skb);
158         else
159                 dev_kfree_skb_any(skb);
160 }
161
162 static ssize_t solos_param_show(struct device *dev, struct device_attribute *attr,
163                                 char *buf)
164 {
165         struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
166         struct solos_card *card = atmdev->dev_data;
167         struct solos_param prm;
168         struct sk_buff *skb;
169         struct pkt_hdr *header;
170         int buflen;
171
172         buflen = strlen(attr->attr.name) + 10;
173
174         skb = alloc_skb(sizeof(*header) + buflen, GFP_KERNEL);
175         if (!skb) {
176                 dev_warn(&card->dev->dev, "Failed to allocate sk_buff in solos_param_show()\n");
177                 return -ENOMEM;
178         }
179
180         header = (void *)skb_put(skb, sizeof(*header));
181
182         buflen = snprintf((void *)&header[1], buflen - 1,
183                           "L%05d\n%s\n", current->pid, attr->attr.name);
184         skb_put(skb, buflen);
185
186         header->size = cpu_to_le16(buflen);
187         header->vpi = cpu_to_le16(0);
188         header->vci = cpu_to_le16(0);
189         header->type = cpu_to_le16(PKT_COMMAND);
190
191         prm.pid = current->pid;
192         prm.response = NULL;
193         prm.port = SOLOS_CHAN(atmdev);
194
195         spin_lock_irq(&card->param_queue_lock);
196         list_add(&prm.list, &card->param_queue);
197         spin_unlock_irq(&card->param_queue_lock);
198
199         fpga_queue(card, prm.port, skb, NULL);
200
201         wait_event_timeout(card->param_wq, prm.response, 5 * HZ);
202
203         spin_lock_irq(&card->param_queue_lock);
204         list_del(&prm.list);
205         spin_unlock_irq(&card->param_queue_lock);
206
207         if (!prm.response)
208                 return -EIO;
209
210         buflen = prm.response->len;
211         memcpy(buf, prm.response->data, buflen);
212         kfree_skb(prm.response);
213
214         return buflen;
215 }
216
217 static ssize_t solos_param_store(struct device *dev, struct device_attribute *attr,
218                                  const char *buf, size_t count)
219 {
220         struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
221         struct solos_card *card = atmdev->dev_data;
222         struct solos_param prm;
223         struct sk_buff *skb;
224         struct pkt_hdr *header;
225         int buflen;
226         ssize_t ret;
227
228         buflen = strlen(attr->attr.name) + 11 + count;
229
230         skb = alloc_skb(sizeof(*header) + buflen, GFP_KERNEL);
231         if (!skb) {
232                 dev_warn(&card->dev->dev, "Failed to allocate sk_buff in solos_param_store()\n");
233                 return -ENOMEM;
234         }
235
236         header = (void *)skb_put(skb, sizeof(*header));
237
238         buflen = snprintf((void *)&header[1], buflen - 1,
239                           "L%05d\n%s\n%s\n", current->pid, attr->attr.name, buf);
240
241         skb_put(skb, buflen);
242         header->size = cpu_to_le16(buflen);
243         header->vpi = cpu_to_le16(0);
244         header->vci = cpu_to_le16(0);
245         header->type = cpu_to_le16(PKT_COMMAND);
246
247         prm.pid = current->pid;
248         prm.response = NULL;
249         prm.port = SOLOS_CHAN(atmdev);
250
251         spin_lock_irq(&card->param_queue_lock);
252         list_add(&prm.list, &card->param_queue);
253         spin_unlock_irq(&card->param_queue_lock);
254
255         fpga_queue(card, prm.port, skb, NULL);
256
257         wait_event_timeout(card->param_wq, prm.response, 5 * HZ);
258
259         spin_lock_irq(&card->param_queue_lock);
260         list_del(&prm.list);
261         spin_unlock_irq(&card->param_queue_lock);
262
263         skb = prm.response;
264
265         if (!skb)
266                 return -EIO;
267
268         buflen = skb->len;
269
270         /* Sometimes it has a newline, sometimes it doesn't. */
271         if (skb->data[buflen - 1] == '\n')
272                 buflen--;
273
274         if (buflen == 2 && !strncmp(skb->data, "OK", 2))
275                 ret = count;
276         else if (buflen == 5 && !strncmp(skb->data, "ERROR", 5))
277                 ret = -EIO;
278         else {
279                 /* We know we have enough space allocated for this; we allocated 
280                    it ourselves */
281                 skb->data[buflen] = 0;
282         
283                 dev_warn(&card->dev->dev, "Unexpected parameter response: '%s'\n",
284                          skb->data);
285                 ret = -EIO;
286         }
287         kfree_skb(skb);
288
289         return ret;
290 }
291
292 static char *next_string(struct sk_buff *skb)
293 {
294         int i = 0;
295         char *this = skb->data;
296
297         while (i < skb->len) {
298                 if (this[i] == '\n') {
299                         this[i] = 0;
300                         skb_pull(skb, i);
301                         return this;
302                 }
303         }
304         return NULL;
305 }
306
307 /*
308  * Status packet has fields separated by \n, starting with a version number
309  * for the information therein. Fields are....
310  *
311  *     packet version
312  *     TxBitRate        (version >= 1)
313  *     RxBitRate        (version >= 1)
314  *     State            (version >= 1)
315  */       
316 static int process_status(struct solos_card *card, int port, struct sk_buff *skb)
317 {
318         char *str, *end, *state_str;
319         int ver, rate_up, rate_down, state, snr, attn;
320
321         if (!card->atmdev[port])
322                 return -ENODEV;
323
324         str = next_string(skb);
325         if (!str)
326                 return -EIO;
327
328         ver = simple_strtol(str, NULL, 10);
329         if (ver < 1) {
330                 dev_warn(&card->dev->dev, "Unexpected status interrupt version %d\n",
331                          ver);
332                 return -EIO;
333         }
334
335         str = next_string(skb);
336         rate_up = simple_strtol(str, &end, 10);
337         if (*end)
338                 return -EIO;
339
340         str = next_string(skb);
341         rate_down = simple_strtol(str, &end, 10);
342         if (*end)
343                 return -EIO;
344
345         state_str = next_string(skb);
346         if (!strcmp(state_str, "Showtime"))
347                 state = ATM_PHY_SIG_FOUND;
348         else {
349                 state = ATM_PHY_SIG_LOST;
350                 release_vccs(card->atmdev[port]);
351         }
352
353         str = next_string(skb);
354         snr = simple_strtol(str, &end, 10);
355         if (*end)
356                 return -EIO;
357
358         str = next_string(skb);
359         attn = simple_strtol(str, &end, 10);
360         if (*end)
361                 return -EIO;
362
363         if (state == ATM_PHY_SIG_LOST && !rate_up && !rate_down)
364                 dev_info(&card->dev->dev, "Port %d ATM state: %s\n",
365                          port, state_str);
366         else
367                 dev_info(&card->dev->dev, "Port %d ATM state: %s (%d/%d kb/s, SNR %ddB, Attn %ddB)\n",
368                          port, state_str, rate_up/1000, rate_down/1000,
369                          snr, attn);
370
371         card->atmdev[port]->link_rate = rate_down;
372         card->atmdev[port]->signal = state;
373
374         return 0;
375 }
376
377 static int process_command(struct solos_card *card, int port, struct sk_buff *skb)
378 {
379         struct solos_param *prm;
380         unsigned long flags;
381         int cmdpid;
382         int found = 0;
383
384         if (skb->len < 7)
385                 return 0;
386
387         if (skb->data[0] != 'L'    || !isdigit(skb->data[1]) ||
388             !isdigit(skb->data[2]) || !isdigit(skb->data[3]) ||
389             !isdigit(skb->data[4]) || !isdigit(skb->data[5]) ||
390             skb->data[6] != '\n')
391                 return 0;
392
393         cmdpid = simple_strtol(&skb->data[1], NULL, 10);
394
395         spin_lock_irqsave(&card->param_queue_lock, flags);
396         list_for_each_entry(prm, &card->param_queue, list) {
397                 if (prm->port == port && prm->pid == cmdpid) {
398                         prm->response = skb;
399                         skb_pull(skb, 7);
400                         wake_up(&card->param_wq);
401                         found = 1;
402                         break;
403                 }
404         }
405         spin_unlock_irqrestore(&card->param_queue_lock, flags);
406         return found;
407 }
408
409 static ssize_t console_show(struct device *dev, struct device_attribute *attr,
410                             char *buf)
411 {
412         struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
413         struct solos_card *card = atmdev->dev_data;
414         struct sk_buff *skb;
415
416         spin_lock(&card->cli_queue_lock);
417         skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]);
418         spin_unlock(&card->cli_queue_lock);
419         if(skb == NULL)
420                 return sprintf(buf, "No data.\n");
421
422         memcpy(buf, skb->data, skb->len);
423         dev_dbg(&card->dev->dev, "len: %d\n", skb->len);
424
425         kfree_skb(skb);
426         return skb->len;
427 }
428
429 static int send_command(struct solos_card *card, int dev, const char *buf, size_t size)
430 {
431         struct sk_buff *skb;
432         struct pkt_hdr *header;
433
434 //      dev_dbg(&card->dev->dev, "size: %d\n", size);
435
436         if (size > (BUF_SIZE - sizeof(*header))) {
437                 dev_dbg(&card->dev->dev, "Command is too big.  Dropping request\n");
438                 return 0;
439         }
440         skb = alloc_skb(size + sizeof(*header), GFP_ATOMIC);
441         if (!skb) {
442                 dev_warn(&card->dev->dev, "Failed to allocate sk_buff in send_command()\n");
443                 return 0;
444         }
445
446         header = (void *)skb_put(skb, sizeof(*header));
447
448         header->size = cpu_to_le16(size);
449         header->vpi = cpu_to_le16(0);
450         header->vci = cpu_to_le16(0);
451         header->type = cpu_to_le16(PKT_COMMAND);
452
453         memcpy(skb_put(skb, size), buf, size);
454
455         fpga_queue(card, dev, skb, NULL);
456
457         return 0;
458 }
459
460 static ssize_t console_store(struct device *dev, struct device_attribute *attr,
461                              const char *buf, size_t count)
462 {
463         struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
464         struct solos_card *card = atmdev->dev_data;
465         int err;
466
467         err = send_command(card, SOLOS_CHAN(atmdev), buf, count);
468
469         return err?:count;
470 }
471
472 static DEVICE_ATTR(console, 0644, console_show, console_store);
473
474
475 #define SOLOS_ATTR_RO(x) static DEVICE_ATTR(x, 0444, solos_param_show, NULL);
476 #define SOLOS_ATTR_RW(x) static DEVICE_ATTR(x, 0644, solos_param_show, solos_param_store);
477
478 #include "solos-attrlist.c"
479
480 #undef SOLOS_ATTR_RO
481 #undef SOLOS_ATTR_RW
482
483 #define SOLOS_ATTR_RO(x) &dev_attr_##x.attr,
484 #define SOLOS_ATTR_RW(x) &dev_attr_##x.attr,
485
486 static struct attribute *solos_attrs[] = {
487 #include "solos-attrlist.c"
488         NULL
489 };
490
491 static struct attribute_group solos_attr_group = {
492         .attrs = solos_attrs,
493         .name = "parameters",
494 };
495
496 static int flash_upgrade(struct solos_card *card, int chip)
497 {
498         const struct firmware *fw;
499         const char *fw_name;
500         uint32_t data32 = 0;
501         int blocksize = 0;
502         int numblocks = 0;
503         int offset;
504
505         if (chip == 0) {
506                 fw_name = "solos-FPGA.bin";
507                 blocksize = FPGA_BLOCK;
508         } else {
509                 fw_name = "solos-Firmware.bin";
510                 blocksize = SOLOS_BLOCK;
511         }
512
513         if (request_firmware(&fw, fw_name, &card->dev->dev))
514                 return -ENOENT;
515
516         dev_info(&card->dev->dev, "Flash upgrade starting\n");
517
518         numblocks = fw->size / blocksize;
519         dev_info(&card->dev->dev, "Firmware size: %zd\n", fw->size);
520         dev_info(&card->dev->dev, "Number of blocks: %d\n", numblocks);
521         
522         dev_info(&card->dev->dev, "Changing FPGA to Update mode\n");
523         iowrite32(1, card->config_regs + FPGA_MODE);
524         data32 = ioread32(card->config_regs + FPGA_MODE); 
525
526         /* Set mode to Chip Erase */
527         dev_info(&card->dev->dev, "Set FPGA Flash mode to %s Chip Erase\n",
528                  chip?"Solos":"FPGA");
529         iowrite32((chip * 2), card->config_regs + FLASH_MODE);
530
531
532         iowrite32(1, card->config_regs + WRITE_FLASH);
533         wait_event(card->fw_wq, !ioread32(card->config_regs + FLASH_BUSY));
534
535         for (offset = 0; offset < fw->size; offset += blocksize) {
536                 int i;
537
538                 /* Clear write flag */
539                 iowrite32(0, card->config_regs + WRITE_FLASH);
540
541                 /* Set mode to Block Write */
542                 /* dev_info(&card->dev->dev, "Set FPGA Flash mode to Block Write\n"); */
543                 iowrite32(((chip * 2) + 1), card->config_regs + FLASH_MODE);
544
545                 /* Copy block to buffer, swapping each 16 bits */
546                 for(i = 0; i < blocksize; i += 4) {
547                         uint32_t word = swahb32p((uint32_t *)(fw->data + offset + i));
548                         iowrite32(word, RX_BUF(card, 3) + i);
549                 }
550
551                 /* Specify block number and then trigger flash write */
552                 iowrite32(offset / blocksize, card->config_regs + FLASH_BLOCK);
553                 iowrite32(1, card->config_regs + WRITE_FLASH);
554                 wait_event(card->fw_wq, !ioread32(card->config_regs + FLASH_BUSY));
555         }
556
557         release_firmware(fw);
558         iowrite32(0, card->config_regs + WRITE_FLASH);
559         iowrite32(0, card->config_regs + FPGA_MODE);
560         iowrite32(0, card->config_regs + FLASH_MODE);
561         dev_info(&card->dev->dev, "Returning FPGA to Data mode\n");
562         return 0;
563 }
564
565 static irqreturn_t solos_irq(int irq, void *dev_id)
566 {
567         struct solos_card *card = dev_id;
568         int handled = 1;
569
570         //ACK IRQ
571         iowrite32(0, card->config_regs + IRQ_CLEAR);
572
573         if (card->atmdev[0])
574                 tasklet_schedule(&card->tlet);
575         else
576                 wake_up(&card->fw_wq);
577
578         return IRQ_RETVAL(handled);
579 }
580
581 void solos_bh(unsigned long card_arg)
582 {
583         struct solos_card *card = (void *)card_arg;
584         int port;
585         uint32_t card_flags;
586         uint32_t rx_done = 0;
587
588         card_flags = ioread32(card->config_regs + FLAGS_ADDR);
589
590         /* The TX bits are set if the channel is busy; clear if not. We want to
591            invoke fpga_tx() unless _all_ the bits for active channels are set */
592         if ((card_flags & card->tx_mask) != card->tx_mask)
593                 fpga_tx(card);
594
595         for (port = 0; port < card->nr_ports; port++) {
596                 if (card_flags & (0x10 << port)) {
597                         struct pkt_hdr _hdr, *header;
598                         struct sk_buff *skb;
599                         struct atm_vcc *vcc;
600                         int size;
601
602                         if (card->using_dma) {
603                                 skb = card->rx_skb[port];
604                                 card->rx_skb[port] = NULL;
605
606                                 pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr,
607                                                  RX_DMA_SIZE, PCI_DMA_FROMDEVICE);
608
609                                 header = (void *)skb->data;
610                                 size = le16_to_cpu(header->size);
611                                 skb_put(skb, size + sizeof(*header));
612                                 skb_pull(skb, sizeof(*header));
613                         } else {
614                                 header = &_hdr;
615
616                                 rx_done |= 0x10 << port;
617
618                                 memcpy_fromio(header, RX_BUF(card, port), sizeof(*header));
619
620                                 size = le16_to_cpu(header->size);
621
622                                 skb = alloc_skb(size + 1, GFP_ATOMIC);
623                                 if (!skb) {
624                                         if (net_ratelimit())
625                                                 dev_warn(&card->dev->dev, "Failed to allocate sk_buff for RX\n");
626                                         continue;
627                                 }
628
629                                 memcpy_fromio(skb_put(skb, size),
630                                               RX_BUF(card, port) + sizeof(*header),
631                                               size);
632                         }
633                         if (atmdebug) {
634                                 dev_info(&card->dev->dev, "Received: device %d\n", port);
635                                 dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n",
636                                          size, le16_to_cpu(header->vpi),
637                                          le16_to_cpu(header->vci));
638                                 print_buffer(skb);
639                         }
640
641                         switch (le16_to_cpu(header->type)) {
642                         case PKT_DATA:
643                                 vcc = find_vcc(card->atmdev[port], le16_to_cpu(header->vpi),
644                                                le16_to_cpu(header->vci));
645                                 if (!vcc) {
646                                         if (net_ratelimit())
647                                                 dev_warn(&card->dev->dev, "Received packet for unknown VCI.VPI %d.%d on port %d\n",
648                                                          le16_to_cpu(header->vci), le16_to_cpu(header->vpi),
649                                                          port);
650                                         continue;
651                                 }
652                                 atm_charge(vcc, skb->truesize);
653                                 vcc->push(vcc, skb);
654                                 atomic_inc(&vcc->stats->rx);
655                                 break;
656
657                         case PKT_STATUS:
658                                 process_status(card, port, skb);
659                                 dev_kfree_skb_any(skb);
660                                 break;
661
662                         case PKT_COMMAND:
663                         default: /* FIXME: Not really, surely? */
664                                 if (process_command(card, port, skb))
665                                         break;
666                                 spin_lock(&card->cli_queue_lock);
667                                 if (skb_queue_len(&card->cli_queue[port]) > 10) {
668                                         if (net_ratelimit())
669                                                 dev_warn(&card->dev->dev, "Dropping console response on port %d\n",
670                                                          port);
671                                         dev_kfree_skb_any(skb);
672                                 } else
673                                         skb_queue_tail(&card->cli_queue[port], skb);
674                                 spin_unlock(&card->cli_queue_lock);
675                                 break;
676                         }
677                 }
678                 /* Allocate RX skbs for any ports which need them */
679                 if (card->using_dma && card->atmdev[port] &&
680                     !card->rx_skb[port]) {
681                         struct sk_buff *skb = alloc_skb(RX_DMA_SIZE, GFP_ATOMIC);
682                         if (skb) {
683                                 SKB_CB(skb)->dma_addr =
684                                         pci_map_single(card->dev, skb->data,
685                                                        RX_DMA_SIZE, PCI_DMA_FROMDEVICE);
686                                 iowrite32(SKB_CB(skb)->dma_addr,
687                                           card->config_regs + RX_DMA_ADDR(port));
688                                 card->rx_skb[port] = skb;
689                         } else {
690                                 if (net_ratelimit())
691                                         dev_warn(&card->dev->dev, "Failed to allocate RX skb");
692
693                                 /* We'll have to try again later */
694                                 tasklet_schedule(&card->tlet);
695                         }
696                 }
697         }
698         if (rx_done)
699                 iowrite32(rx_done, card->config_regs + FLAGS_ADDR);
700
701         return;
702 }
703
704 static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci)
705 {
706         struct hlist_head *head;
707         struct atm_vcc *vcc = NULL;
708         struct hlist_node *node;
709         struct sock *s;
710
711         read_lock(&vcc_sklist_lock);
712         head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
713         sk_for_each(s, node, head) {
714                 vcc = atm_sk(s);
715                 if (vcc->dev == dev && vcc->vci == vci &&
716                     vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE)
717                         goto out;
718         }
719         vcc = NULL;
720  out:
721         read_unlock(&vcc_sklist_lock);
722         return vcc;
723 }
724
725 static int list_vccs(int vci)
726 {
727         struct hlist_head *head;
728         struct atm_vcc *vcc;
729         struct hlist_node *node;
730         struct sock *s;
731         int num_found = 0;
732         int i;
733
734         read_lock(&vcc_sklist_lock);
735         if (vci != 0){
736                 head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
737                 sk_for_each(s, node, head) {
738                         num_found ++;
739                         vcc = atm_sk(s);
740                         printk(KERN_DEBUG "Device: %d Vpi: %d Vci: %d\n",
741                                vcc->dev->number,
742                                vcc->vpi,
743                                vcc->vci);
744                 }
745         } else {
746                 for(i = 0; i < VCC_HTABLE_SIZE; i++){
747                         head = &vcc_hash[i];
748                         sk_for_each(s, node, head) {
749                                 num_found ++;
750                                 vcc = atm_sk(s);
751                                 printk(KERN_DEBUG "Device: %d Vpi: %d Vci: %d\n",
752                                        vcc->dev->number,
753                                        vcc->vpi,
754                                        vcc->vci);
755                         }
756                 }
757         }
758         read_unlock(&vcc_sklist_lock);
759         return num_found;
760 }
761
762 static void release_vccs(struct atm_dev *dev)
763 {
764         int i;
765
766         write_lock_irq(&vcc_sklist_lock);
767         for (i = 0; i < VCC_HTABLE_SIZE; i++) {
768                 struct hlist_head *head = &vcc_hash[i];
769                 struct hlist_node *node, *tmp;
770                 struct sock *s;
771                 struct atm_vcc *vcc;
772
773                 sk_for_each_safe(s, node, tmp, head) {
774                         vcc = atm_sk(s);
775                         if (vcc->dev == dev) {
776                                 vcc_release_async(vcc, -EPIPE);
777                                 sk_del_node_init(s);
778                         }
779                 }
780         }
781         write_unlock_irq(&vcc_sklist_lock);
782 }
783
784
785 static int popen(struct atm_vcc *vcc)
786 {
787         struct solos_card *card = vcc->dev->dev_data;
788         struct sk_buff *skb;
789         struct pkt_hdr *header;
790
791         if (vcc->qos.aal != ATM_AAL5) {
792                 dev_warn(&card->dev->dev, "Unsupported ATM type %d\n",
793                          vcc->qos.aal);
794                 return -EINVAL;
795         }
796
797         skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
798         if (!skb && net_ratelimit()) {
799                 dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n");
800                 return -ENOMEM;
801         }
802         header = (void *)skb_put(skb, sizeof(*header));
803
804         header->size = cpu_to_le16(0);
805         header->vpi = cpu_to_le16(vcc->vpi);
806         header->vci = cpu_to_le16(vcc->vci);
807         header->type = cpu_to_le16(PKT_POPEN);
808
809         fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, NULL);
810
811 //      dev_dbg(&card->dev->dev, "Open for vpi %d and vci %d on interface %d\n", vcc->vpi, vcc->vci, SOLOS_CHAN(vcc->dev));
812         set_bit(ATM_VF_ADDR, &vcc->flags); // accept the vpi / vci
813         set_bit(ATM_VF_READY, &vcc->flags);
814         list_vccs(0);
815
816
817         return 0;
818 }
819
820 static void pclose(struct atm_vcc *vcc)
821 {
822         struct solos_card *card = vcc->dev->dev_data;
823         struct sk_buff *skb;
824         struct pkt_hdr *header;
825
826         skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
827         if (!skb) {
828                 dev_warn(&card->dev->dev, "Failed to allocate sk_buff in pclose()\n");
829                 return;
830         }
831         header = (void *)skb_put(skb, sizeof(*header));
832
833         header->size = cpu_to_le16(0);
834         header->vpi = cpu_to_le16(vcc->vpi);
835         header->vci = cpu_to_le16(vcc->vci);
836         header->type = cpu_to_le16(PKT_PCLOSE);
837
838         fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, NULL);
839
840 //      dev_dbg(&card->dev->dev, "Close for vpi %d and vci %d on interface %d\n", vcc->vpi, vcc->vci, SOLOS_CHAN(vcc->dev));
841
842         clear_bit(ATM_VF_ADDR, &vcc->flags);
843         clear_bit(ATM_VF_READY, &vcc->flags);
844
845         return;
846 }
847
848 static int print_buffer(struct sk_buff *buf)
849 {
850         int len,i;
851         char msg[500];
852         char item[10];
853
854         len = buf->len;
855         for (i = 0; i < len; i++){
856                 if(i % 8 == 0)
857                         sprintf(msg, "%02X: ", i);
858
859                 sprintf(item,"%02X ",*(buf->data + i));
860                 strcat(msg, item);
861                 if(i % 8 == 7) {
862                         sprintf(item, "\n");
863                         strcat(msg, item);
864                         printk(KERN_DEBUG "%s", msg);
865                 }
866         }
867         if (i % 8 != 0) {
868                 sprintf(item, "\n");
869                 strcat(msg, item);
870                 printk(KERN_DEBUG "%s", msg);
871         }
872         printk(KERN_DEBUG "\n");
873
874         return 0;
875 }
876
877 static void fpga_queue(struct solos_card *card, int port, struct sk_buff *skb,
878                        struct atm_vcc *vcc)
879 {
880         int old_len;
881         unsigned long flags;
882
883         SKB_CB(skb)->vcc = vcc;
884
885         spin_lock_irqsave(&card->tx_queue_lock, flags);
886         old_len = skb_queue_len(&card->tx_queue[port]);
887         skb_queue_tail(&card->tx_queue[port], skb);
888         if (!old_len) {
889                 card->tx_mask |= (1 << port);
890         }
891         spin_unlock_irqrestore(&card->tx_queue_lock, flags);
892
893         /* Theoretically we could just schedule the tasklet here, but
894            that introduces latency we don't want -- it's noticeable */
895         if (!old_len)
896                 fpga_tx(card);
897 }
898
899 static int fpga_tx(struct solos_card *card)
900 {
901         uint32_t tx_pending;
902         uint32_t tx_started = 0;
903         struct sk_buff *skb;
904         struct atm_vcc *vcc;
905         unsigned char port;
906         unsigned long flags;
907
908         spin_lock_irqsave(&card->tx_lock, flags);
909
910         tx_pending = ioread32(card->config_regs + FLAGS_ADDR) & card->tx_mask;
911
912         dev_vdbg(&card->dev->dev, "TX Flags are %X\n", tx_pending);
913
914         for (port = 0; port < card->nr_ports; port++) {
915                 if (card->atmdev[port] && !(tx_pending & (1 << port))) {
916                         struct sk_buff *oldskb = card->tx_skb[port];
917
918                         if (oldskb)
919                                 pci_unmap_single(card->dev, SKB_CB(oldskb)->dma_addr,
920                                                  oldskb->len, PCI_DMA_TODEVICE);
921                         
922                         spin_lock(&card->tx_queue_lock);
923                         skb = skb_dequeue(&card->tx_queue[port]);
924                         if (!skb)
925                                 card->tx_mask &= ~(1 << port);
926                         spin_unlock(&card->tx_queue_lock);
927
928                         if (skb && !card->using_dma) {
929                                 memcpy_toio(TX_BUF(card, port), skb->data, skb->len);
930                                 tx_started |= 1 << port; //Set TX full flag
931                                 oldskb = skb; /* We're done with this skb already */
932                         } else if (skb && card->using_dma) {
933                                 SKB_CB(skb)->dma_addr = pci_map_single(card->dev, skb->data,
934                                                                        skb->len, PCI_DMA_TODEVICE);
935                                 iowrite32(SKB_CB(skb)->dma_addr,
936                                           card->config_regs + TX_DMA_ADDR(port));
937                         }
938
939                         if (!oldskb)
940                                 continue;
941
942                         /* Clean up and free oldskb now it's gone */
943                         if (atmdebug) {
944                                 dev_info(&card->dev->dev, "Transmitted: port %d\n",
945                                          port);
946                                 print_buffer(oldskb);
947                         }
948
949                         vcc = SKB_CB(oldskb)->vcc;
950
951                         if (vcc) {
952                                 atomic_inc(&vcc->stats->tx);
953                                 solos_pop(vcc, oldskb);
954                         } else
955                                 dev_kfree_skb_irq(oldskb);
956
957                 }
958         }
959         if (tx_started)
960                 iowrite32(tx_started, card->config_regs + FLAGS_ADDR);
961
962         spin_unlock_irqrestore(&card->tx_lock, flags);
963         return 0;
964 }
965
966 static int psend(struct atm_vcc *vcc, struct sk_buff *skb)
967 {
968         struct solos_card *card = vcc->dev->dev_data;
969         struct pkt_hdr *header;
970         int pktlen;
971
972         //dev_dbg(&card->dev->dev, "psend called.\n");
973         //dev_dbg(&card->dev->dev, "dev,vpi,vci = %d,%d,%d\n",SOLOS_CHAN(vcc->dev),vcc->vpi,vcc->vci);
974
975         pktlen = skb->len;
976         if (pktlen > (BUF_SIZE - sizeof(*header))) {
977                 dev_warn(&card->dev->dev, "Length of PDU is too large. Dropping PDU.\n");
978                 solos_pop(vcc, skb);
979                 return 0;
980         }
981
982         if (!skb_clone_writable(skb, sizeof(*header))) {
983                 int expand_by = 0;
984                 int ret;
985
986                 if (skb_headroom(skb) < sizeof(*header))
987                         expand_by = sizeof(*header) - skb_headroom(skb);
988
989                 ret = pskb_expand_head(skb, expand_by, 0, GFP_ATOMIC);
990                 if (ret) {
991                         dev_warn(&card->dev->dev, "pskb_expand_head failed.\n");
992                         solos_pop(vcc, skb);
993                         return ret;
994                 }
995         }
996
997         header = (void *)skb_push(skb, sizeof(*header));
998
999         /* This does _not_ include the size of the header */
1000         header->size = cpu_to_le16(pktlen);
1001         header->vpi = cpu_to_le16(vcc->vpi);
1002         header->vci = cpu_to_le16(vcc->vci);
1003         header->type = cpu_to_le16(PKT_DATA);
1004
1005         fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, vcc);
1006
1007         return 0;
1008 }
1009
1010 static struct atmdev_ops fpga_ops = {
1011         .open =         popen,
1012         .close =        pclose,
1013         .ioctl =        NULL,
1014         .getsockopt =   NULL,
1015         .setsockopt =   NULL,
1016         .send =         psend,
1017         .send_oam =     NULL,
1018         .phy_put =      NULL,
1019         .phy_get =      NULL,
1020         .change_qos =   NULL,
1021         .proc_read =    NULL,
1022         .owner =        THIS_MODULE
1023 };
1024
1025 static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
1026 {
1027         int err, i;
1028         uint16_t fpga_ver;
1029         uint8_t major_ver, minor_ver;
1030         uint32_t data32;
1031         struct solos_card *card;
1032
1033         card = kzalloc(sizeof(*card), GFP_KERNEL);
1034         if (!card)
1035                 return -ENOMEM;
1036
1037         card->dev = dev;
1038         init_waitqueue_head(&card->fw_wq);
1039         init_waitqueue_head(&card->param_wq);
1040
1041         err = pci_enable_device(dev);
1042         if (err) {
1043                 dev_warn(&dev->dev,  "Failed to enable PCI device\n");
1044                 goto out;
1045         }
1046
1047         err = pci_set_dma_mask(dev, DMA_32BIT_MASK);
1048         if (err) {
1049                 dev_warn(&dev->dev, "Failed to set 32-bit DMA mask\n");
1050                 goto out;
1051         }
1052
1053         err = pci_request_regions(dev, "solos");
1054         if (err) {
1055                 dev_warn(&dev->dev, "Failed to request regions\n");
1056                 goto out;
1057         }
1058
1059         card->config_regs = pci_iomap(dev, 0, CONFIG_RAM_SIZE);
1060         if (!card->config_regs) {
1061                 dev_warn(&dev->dev, "Failed to ioremap config registers\n");
1062                 goto out_release_regions;
1063         }
1064         card->buffers = pci_iomap(dev, 1, DATA_RAM_SIZE);
1065         if (!card->buffers) {
1066                 dev_warn(&dev->dev, "Failed to ioremap data buffers\n");
1067                 goto out_unmap_config;
1068         }
1069
1070 //      for(i=0;i<64 ;i+=4){
1071 //              data32=ioread32(card->buffers + i);
1072 //              dev_dbg(&card->dev->dev, "%08lX\n",(unsigned long)data32);
1073 //      }
1074
1075         //Fill Config Mem with zeros
1076         for(i = 0; i < 128; i += 4)
1077                 iowrite32(0, card->config_regs + i);
1078
1079         //Set RX empty flags
1080         iowrite32(0xF0, card->config_regs + FLAGS_ADDR);
1081
1082         data32 = ioread32(card->config_regs + FPGA_VER);
1083         fpga_ver = (data32 & 0x0000FFFF);
1084         major_ver = ((data32 & 0xFF000000) >> 24);
1085         minor_ver = ((data32 & 0x00FF0000) >> 16);
1086         dev_info(&dev->dev, "Solos FPGA Version %d.%02d svn-%d\n",
1087                  major_ver, minor_ver, fpga_ver);
1088
1089         if (fpga_ver > 27)
1090                 card->using_dma = 1;
1091
1092         card->nr_ports = 2; /* FIXME: Detect daughterboard */
1093
1094         pci_set_drvdata(dev, card);
1095
1096         tasklet_init(&card->tlet, solos_bh, (unsigned long)card);
1097         spin_lock_init(&card->tx_lock);
1098         spin_lock_init(&card->tx_queue_lock);
1099         spin_lock_init(&card->cli_queue_lock);
1100         spin_lock_init(&card->param_queue_lock);
1101         INIT_LIST_HEAD(&card->param_queue);
1102
1103 /*
1104         // Set Loopback mode
1105         data32 = 0x00010000;
1106         iowrite32(data32,card->config_regs + FLAGS_ADDR);
1107 */
1108 /*
1109         // Fill Buffers with zeros
1110         for (i = 0; i < BUF_SIZE * 8; i += 4)
1111                 iowrite32(0, card->buffers + i);
1112 */
1113 /*
1114         for(i = 0; i < (BUF_SIZE * 1); i += 4)
1115                 iowrite32(0x12345678, card->buffers + i + (0*BUF_SIZE));
1116         for(i = 0; i < (BUF_SIZE * 1); i += 4)
1117                 iowrite32(0xabcdef98, card->buffers + i + (1*BUF_SIZE));
1118
1119         // Read Config Memory
1120         printk(KERN_DEBUG "Reading Config MEM\n");
1121         i = 0;
1122         for(i = 0; i < 16; i++) {
1123                 data32=ioread32(card->buffers + i*(BUF_SIZE/2));
1124                 printk(KERN_ALERT "Addr: %lX Data: %08lX\n",
1125                        (unsigned long)(addr_start + i*(BUF_SIZE/2)),
1126                        (unsigned long)data32);
1127         }
1128 */
1129         //dev_dbg(&card->dev->dev, "Requesting IRQ: %d\n",dev->irq);
1130         err = request_irq(dev->irq, solos_irq, IRQF_SHARED,
1131                           "solos-pci", card);
1132         if (err) {
1133                 dev_dbg(&card->dev->dev, "Failed to request interrupt IRQ: %d\n", dev->irq);
1134                 goto out_unmap_both;
1135         }
1136
1137         // Enable IRQs
1138         iowrite32(1, card->config_regs + IRQ_EN_ADDR);
1139
1140         if (fpga_upgrade)
1141                 flash_upgrade(card, 0);
1142
1143         if (firmware_upgrade)
1144                 flash_upgrade(card, 1);
1145
1146         err = atm_init(card);
1147         if (err)
1148                 goto out_free_irq;
1149
1150         return 0;
1151
1152  out_free_irq:
1153         iowrite32(0, card->config_regs + IRQ_EN_ADDR);
1154         free_irq(dev->irq, card);
1155         tasklet_kill(&card->tlet);
1156         
1157  out_unmap_both:
1158         pci_set_drvdata(dev, NULL);
1159         pci_iounmap(dev, card->config_regs);
1160  out_unmap_config:
1161         pci_iounmap(dev, card->buffers);
1162  out_release_regions:
1163         pci_release_regions(dev);
1164  out:
1165         return err;
1166 }
1167
1168 static int atm_init(struct solos_card *card)
1169 {
1170         int i;
1171
1172         for (i = 0; i < card->nr_ports; i++) {
1173                 struct sk_buff *skb;
1174                 struct pkt_hdr *header;
1175
1176                 skb_queue_head_init(&card->tx_queue[i]);
1177                 skb_queue_head_init(&card->cli_queue[i]);
1178
1179                 card->atmdev[i] = atm_dev_register("solos-pci", &fpga_ops, -1, NULL);
1180                 if (!card->atmdev[i]) {
1181                         dev_err(&card->dev->dev, "Could not register ATM device %d\n", i);
1182                         atm_remove(card);
1183                         return -ENODEV;
1184                 }
1185                 if (device_create_file(&card->atmdev[i]->class_dev, &dev_attr_console))
1186                         dev_err(&card->dev->dev, "Could not register console for ATM device %d\n", i);
1187                 if (sysfs_create_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group))
1188                         dev_err(&card->dev->dev, "Could not register parameter group for ATM device %d\n", i);
1189
1190                 dev_info(&card->dev->dev, "Registered ATM device %d\n", card->atmdev[i]->number);
1191
1192                 card->atmdev[i]->ci_range.vpi_bits = 8;
1193                 card->atmdev[i]->ci_range.vci_bits = 16;
1194                 card->atmdev[i]->dev_data = card;
1195                 card->atmdev[i]->phy_data = (void *)(unsigned long)i;
1196                 card->atmdev[i]->signal = ATM_PHY_SIG_UNKNOWN;
1197
1198                 skb = alloc_skb(sizeof(*header), GFP_ATOMIC);
1199                 if (!skb) {
1200                         dev_warn(&card->dev->dev, "Failed to allocate sk_buff in atm_init()\n");
1201                         continue;
1202                 }
1203
1204                 header = (void *)skb_put(skb, sizeof(*header));
1205
1206                 header->size = cpu_to_le16(0);
1207                 header->vpi = cpu_to_le16(0);
1208                 header->vci = cpu_to_le16(0);
1209                 header->type = cpu_to_le16(PKT_STATUS);
1210
1211                 fpga_queue(card, i, skb, NULL);
1212         }
1213         return 0;
1214 }
1215
1216 static void atm_remove(struct solos_card *card)
1217 {
1218         int i;
1219
1220         for (i = 0; i < card->nr_ports; i++) {
1221                 if (card->atmdev[i]) {
1222                         dev_info(&card->dev->dev, "Unregistering ATM device %d\n", card->atmdev[i]->number);
1223
1224                         sysfs_remove_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group);
1225                         atm_dev_deregister(card->atmdev[i]);
1226                 }
1227         }
1228 }
1229
1230 static void fpga_remove(struct pci_dev *dev)
1231 {
1232         struct solos_card *card = pci_get_drvdata(dev);
1233
1234         atm_remove(card);
1235
1236         dev_vdbg(&dev->dev, "Freeing IRQ\n");
1237         // Disable IRQs from FPGA
1238         iowrite32(0, card->config_regs + IRQ_EN_ADDR);
1239         free_irq(dev->irq, card);
1240         tasklet_kill(&card->tlet);
1241
1242         //      iowrite32(0x01,pciregs);
1243         dev_vdbg(&dev->dev, "Unmapping PCI resource\n");
1244         pci_iounmap(dev, card->buffers);
1245         pci_iounmap(dev, card->config_regs);
1246
1247         dev_vdbg(&dev->dev, "Releasing PCI Region\n");
1248         pci_release_regions(dev);
1249         pci_disable_device(dev);
1250
1251         pci_set_drvdata(dev, NULL);
1252         kfree(card);
1253 //      dev_dbg(&card->dev->dev, "fpga_remove\n");
1254         return;
1255 }
1256
1257 static struct pci_device_id fpga_pci_tbl[] __devinitdata = {
1258         { 0x10ee, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
1259         { 0, }
1260 };
1261
1262 MODULE_DEVICE_TABLE(pci,fpga_pci_tbl);
1263
1264 static struct pci_driver fpga_driver = {
1265         .name =         "solos",
1266         .id_table =     fpga_pci_tbl,
1267         .probe =        fpga_probe,
1268         .remove =       fpga_remove,
1269 };
1270
1271
1272 static int __init solos_pci_init(void)
1273 {
1274         printk(KERN_INFO "Solos PCI Driver Version %s\n", VERSION);
1275         return pci_register_driver(&fpga_driver);
1276 }
1277
1278 static void __exit solos_pci_exit(void)
1279 {
1280         pci_unregister_driver(&fpga_driver);
1281         printk(KERN_INFO "Solos PCI Driver %s Unloaded\n", VERSION);
1282 }
1283
1284 module_init(solos_pci_init);
1285 module_exit(solos_pci_exit);