• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/usb/atm/
1/*-
2 * Copyright (c) 2003, 2004
3 *	Damien Bergamini <damien.bergamini@free.fr>. All rights reserved.
4 *
5 * Copyright (c) 2005-2007 Matthieu Castet <castet.matthieu@free.fr>
6 * Copyright (c) 2005-2007 Stanislaw Gruszka <stf_xl@wp.pl>
7 *
8 * This software is available to you under a choice of one of two
9 * licenses. You may choose to be licensed under the terms of the GNU
10 * General Public License (GPL) Version 2, available from the file
11 * COPYING in the main directory of this source tree, or the
12 * BSD license below:
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice unmodified, this list of conditions, and the following
19 *    disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 *    notice, this list of conditions and the following disclaimer in the
22 *    documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * GPL license :
37 * This program is free software; you can redistribute it and/or
38 * modify it under the terms of the GNU General Public License
39 * as published by the Free Software Foundation; either version 2
40 * of the License, or (at your option) any later version.
41 *
42 * This program is distributed in the hope that it will be useful,
43 * but WITHOUT ANY WARRANTY; without even the implied warranty of
44 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
45 * GNU General Public License for more details.
46 *
47 * You should have received a copy of the GNU General Public License
48 * along with this program; if not, write to the Free Software
49 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
50 *
51 *
52 * HISTORY : some part of the code was base on ueagle 1.3 BSD driver,
53 * Damien Bergamini agree to put his code under a DUAL GPL/BSD license.
54 *
55 * The rest of the code was was rewritten from scratch.
56 */
57
58#include <linux/module.h>
59#include <linux/moduleparam.h>
60#include <linux/init.h>
61#include <linux/crc32.h>
62#include <linux/usb.h>
63#include <linux/firmware.h>
64#include <linux/ctype.h>
65#include <linux/sched.h>
66#include <linux/kthread.h>
67#include <linux/mutex.h>
68#include <linux/freezer.h>
69#include <linux/slab.h>
70#include <linux/kernel.h>
71
72#include <asm/unaligned.h>
73
74#include "usbatm.h"
75
76#define EAGLEUSBVERSION "ueagle 1.4"
77
78
79/*
80 * Debug macros
81 */
82#define uea_dbg(usb_dev, format, args...)	\
83	do { \
84		if (debug >= 1) \
85			dev_dbg(&(usb_dev)->dev, \
86				"[ueagle-atm dbg] %s: " format, \
87					__func__, ##args); \
88	} while (0)
89
90#define uea_vdbg(usb_dev, format, args...)	\
91	do { \
92		if (debug >= 2) \
93			dev_dbg(&(usb_dev)->dev, \
94				"[ueagle-atm vdbg]  " format, ##args); \
95	} while (0)
96
97#define uea_enters(usb_dev) \
98	uea_vdbg(usb_dev, "entering %s\n" , __func__)
99
100#define uea_leaves(usb_dev) \
101	uea_vdbg(usb_dev, "leaving  %s\n" , __func__)
102
103#define uea_err(usb_dev, format, args...) \
104	dev_err(&(usb_dev)->dev , "[UEAGLE-ATM] " format , ##args)
105
106#define uea_warn(usb_dev, format, args...) \
107	dev_warn(&(usb_dev)->dev , "[Ueagle-atm] " format, ##args)
108
109#define uea_info(usb_dev, format, args...) \
110	dev_info(&(usb_dev)->dev , "[ueagle-atm] " format, ##args)
111
112struct intr_pkt;
113
114/* cmv's from firmware */
115struct uea_cmvs_v1 {
116	u32 address;
117	u16 offset;
118	u32 data;
119} __attribute__ ((packed));
120
121struct uea_cmvs_v2 {
122	u32 group;
123	u32 address;
124	u32 offset;
125	u32 data;
126} __attribute__ ((packed));
127
128/* information about currently processed cmv */
129struct cmv_dsc_e1 {
130	u8 function;
131	u16 idx;
132	u32 address;
133	u16 offset;
134};
135
136struct cmv_dsc_e4 {
137	u16 function;
138	u16 offset;
139	u16 address;
140	u16 group;
141};
142
143union cmv_dsc {
144	struct cmv_dsc_e1 e1;
145	struct cmv_dsc_e4 e4;
146};
147
148struct uea_softc {
149	struct usb_device *usb_dev;
150	struct usbatm_data *usbatm;
151
152	int modem_index;
153	unsigned int driver_info;
154	int annex;
155#define ANNEXA 0
156#define ANNEXB 1
157
158	int booting;
159	int reset;
160
161	wait_queue_head_t sync_q;
162
163	struct task_struct *kthread;
164	u32 data;
165	u32 data1;
166
167	int cmv_ack;
168	union cmv_dsc cmv_dsc;
169
170	struct work_struct task;
171	struct workqueue_struct *work_q;
172	u16 pageno;
173	u16 ovl;
174
175	const struct firmware *dsp_firm;
176	struct urb *urb_int;
177
178	void (*dispatch_cmv) (struct uea_softc *, struct intr_pkt *);
179	void (*schedule_load_page) (struct uea_softc *, struct intr_pkt *);
180	int (*stat) (struct uea_softc *);
181	int (*send_cmvs) (struct uea_softc *);
182
183	/* keep in sync with eaglectl */
184	struct uea_stats {
185		struct {
186			u32 state;
187			u32 flags;
188			u32 mflags;
189			u32 vidcpe;
190			u32 vidco;
191			u32 dsrate;
192			u32 usrate;
193			u32 dsunc;
194			u32 usunc;
195			u32 dscorr;
196			u32 uscorr;
197			u32 txflow;
198			u32 rxflow;
199			u32 usattenuation;
200			u32 dsattenuation;
201			u32 dsmargin;
202			u32 usmargin;
203			u32 firmid;
204		} phy;
205	} stats;
206};
207
208/*
209 * Elsa IDs
210 */
211#define ELSA_VID		0x05CC
212#define ELSA_PID_PSTFIRM	0x3350
213#define ELSA_PID_PREFIRM	0x3351
214
215#define ELSA_PID_A_PREFIRM	0x3352
216#define ELSA_PID_A_PSTFIRM	0x3353
217#define ELSA_PID_B_PREFIRM	0x3362
218#define ELSA_PID_B_PSTFIRM	0x3363
219
220/*
221 * Devolo IDs : pots if (pid & 0x10)
222 */
223#define DEVOLO_VID			0x1039
224#define DEVOLO_EAGLE_I_A_PID_PSTFIRM	0x2110
225#define DEVOLO_EAGLE_I_A_PID_PREFIRM	0x2111
226
227#define DEVOLO_EAGLE_I_B_PID_PSTFIRM	0x2100
228#define DEVOLO_EAGLE_I_B_PID_PREFIRM	0x2101
229
230#define DEVOLO_EAGLE_II_A_PID_PSTFIRM	0x2130
231#define DEVOLO_EAGLE_II_A_PID_PREFIRM	0x2131
232
233#define DEVOLO_EAGLE_II_B_PID_PSTFIRM	0x2120
234#define DEVOLO_EAGLE_II_B_PID_PREFIRM	0x2121
235
236/*
237 * Reference design USB IDs
238 */
239#define ANALOG_VID		0x1110
240#define ADI930_PID_PREFIRM	0x9001
241#define ADI930_PID_PSTFIRM	0x9000
242
243#define EAGLE_I_PID_PREFIRM	0x9010	/* Eagle I */
244#define EAGLE_I_PID_PSTFIRM	0x900F	/* Eagle I */
245
246#define EAGLE_IIC_PID_PREFIRM	0x9024	/* Eagle IIC */
247#define EAGLE_IIC_PID_PSTFIRM	0x9023	/* Eagle IIC */
248
249#define EAGLE_II_PID_PREFIRM	0x9022	/* Eagle II */
250#define EAGLE_II_PID_PSTFIRM	0x9021	/* Eagle II */
251
252#define EAGLE_III_PID_PREFIRM	0x9032	/* Eagle III */
253#define EAGLE_III_PID_PSTFIRM	0x9031	/* Eagle III */
254
255#define EAGLE_IV_PID_PREFIRM	0x9042  /* Eagle IV */
256#define EAGLE_IV_PID_PSTFIRM	0x9041  /* Eagle IV */
257
258/*
259 * USR USB IDs
260 */
261#define USR_VID			0x0BAF
262#define MILLER_A_PID_PREFIRM	0x00F2
263#define MILLER_A_PID_PSTFIRM	0x00F1
264#define MILLER_B_PID_PREFIRM	0x00FA
265#define MILLER_B_PID_PSTFIRM	0x00F9
266#define HEINEKEN_A_PID_PREFIRM	0x00F6
267#define HEINEKEN_A_PID_PSTFIRM	0x00F5
268#define HEINEKEN_B_PID_PREFIRM	0x00F8
269#define HEINEKEN_B_PID_PSTFIRM	0x00F7
270
271#define PREFIRM 0
272#define PSTFIRM (1<<7)
273#define AUTO_ANNEX_A (1<<8)
274#define AUTO_ANNEX_B (1<<9)
275
276enum {
277	ADI930 = 0,
278	EAGLE_I,
279	EAGLE_II,
280	EAGLE_III,
281	EAGLE_IV
282};
283
284/* macros for both struct usb_device_id and struct uea_softc */
285#define UEA_IS_PREFIRM(x) \
286	(!((x)->driver_info & PSTFIRM))
287#define UEA_CHIP_VERSION(x) \
288	((x)->driver_info & 0xf)
289
290#define IS_ISDN(x) \
291	((x)->annex & ANNEXB)
292
293#define INS_TO_USBDEV(ins) (ins->usb_dev)
294
295#define GET_STATUS(data) \
296	((data >> 8) & 0xf)
297
298#define IS_OPERATIONAL(sc) \
299	((UEA_CHIP_VERSION(sc) != EAGLE_IV) ? \
300	(GET_STATUS(sc->stats.phy.state) == 2) : \
301	(sc->stats.phy.state == 7))
302
303/*
304 * Set of macros to handle unaligned data in the firmware blob.
305 * The FW_GET_BYTE() macro is provided only for consistency.
306 */
307
308#define FW_GET_BYTE(p) (*((__u8 *) (p)))
309
310#define FW_DIR "ueagle-atm/"
311#define UEA_FW_NAME_MAX 30
312#define NB_MODEM 4
313
314#define BULK_TIMEOUT 300
315#define CTRL_TIMEOUT 1000
316
317#define ACK_TIMEOUT msecs_to_jiffies(3000)
318
319#define UEA_INTR_IFACE_NO	0
320#define UEA_US_IFACE_NO		1
321#define UEA_DS_IFACE_NO		2
322
323#define FASTEST_ISO_INTF	8
324
325#define UEA_BULK_DATA_PIPE	0x02
326#define UEA_IDMA_PIPE		0x04
327#define UEA_INTR_PIPE		0x04
328#define UEA_ISO_DATA_PIPE	0x08
329
330#define UEA_E1_SET_BLOCK	0x0001
331#define UEA_E4_SET_BLOCK	0x002c
332#define UEA_SET_MODE		0x0003
333#define UEA_SET_2183_DATA	0x0004
334#define UEA_SET_TIMEOUT		0x0011
335
336#define UEA_LOOPBACK_OFF	0x0002
337#define UEA_LOOPBACK_ON		0x0003
338#define UEA_BOOT_IDMA		0x0006
339#define UEA_START_RESET		0x0007
340#define UEA_END_RESET		0x0008
341
342#define UEA_SWAP_MAILBOX	(0x3fcd | 0x4000)
343#define UEA_MPTX_START		(0x3fce | 0x4000)
344#define UEA_MPTX_MAILBOX	(0x3fd6 | 0x4000)
345#define UEA_MPRX_MAILBOX	(0x3fdf | 0x4000)
346
347/* block information in eagle4 dsp firmware  */
348struct block_index {
349	__le32 PageOffset;
350	__le32 NotLastBlock;
351	__le32 dummy;
352	__le32 PageSize;
353	__le32 PageAddress;
354	__le16 dummy1;
355	__le16 PageNumber;
356} __attribute__ ((packed));
357
358#define E4_IS_BOOT_PAGE(PageSize) ((le32_to_cpu(PageSize)) & 0x80000000)
359#define E4_PAGE_BYTES(PageSize) ((le32_to_cpu(PageSize) & 0x7fffffff) * 4)
360
361#define E4_L1_STRING_HEADER 0x10
362#define E4_MAX_PAGE_NUMBER 0x58
363#define E4_NO_SWAPPAGE_HEADERS 0x31
364
365/* l1_code is eagle4 dsp firmware format */
366struct l1_code {
367	u8 string_header[E4_L1_STRING_HEADER];
368	u8 page_number_to_block_index[E4_MAX_PAGE_NUMBER];
369	struct block_index page_header[E4_NO_SWAPPAGE_HEADERS];
370	u8 code[0];
371} __attribute__ ((packed));
372
373/* structures describing a block within a DSP page */
374struct block_info_e1 {
375	__le16 wHdr;
376	__le16 wAddress;
377	__le16 wSize;
378	__le16 wOvlOffset;
379	__le16 wOvl;		/* overlay */
380	__le16 wLast;
381} __attribute__ ((packed));
382#define E1_BLOCK_INFO_SIZE 12
383
384struct block_info_e4 {
385	__be16 wHdr;
386	__u8 bBootPage;
387	__u8 bPageNumber;
388	__be32 dwSize;
389	__be32 dwAddress;
390	__be16 wReserved;
391} __attribute__ ((packed));
392#define E4_BLOCK_INFO_SIZE 14
393
394#define UEA_BIHDR 0xabcd
395#define UEA_RESERVED 0xffff
396
397/* constants describing cmv type */
398#define E1_PREAMBLE 0x535c
399#define E1_MODEMTOHOST 0x01
400#define E1_HOSTTOMODEM 0x10
401
402#define E1_MEMACCESS 0x1
403#define E1_ADSLDIRECTIVE 0x7
404#define E1_FUNCTION_TYPE(f) ((f) >> 4)
405#define E1_FUNCTION_SUBTYPE(f) ((f) & 0x0f)
406
407#define E4_MEMACCESS 0
408#define E4_ADSLDIRECTIVE 0xf
409#define E4_FUNCTION_TYPE(f) ((f) >> 8)
410#define E4_FUNCTION_SIZE(f) ((f) & 0x0f)
411#define E4_FUNCTION_SUBTYPE(f) (((f) >> 4) & 0x0f)
412
413/* for MEMACCESS */
414#define E1_REQUESTREAD	0x0
415#define E1_REQUESTWRITE	0x1
416#define E1_REPLYREAD	0x2
417#define E1_REPLYWRITE	0x3
418
419#define E4_REQUESTREAD	0x0
420#define E4_REQUESTWRITE	0x4
421#define E4_REPLYREAD	(E4_REQUESTREAD | 1)
422#define E4_REPLYWRITE	(E4_REQUESTWRITE | 1)
423
424/* for ADSLDIRECTIVE */
425#define E1_KERNELREADY 0x0
426#define E1_MODEMREADY  0x1
427
428#define E4_KERNELREADY 0x0
429#define E4_MODEMREADY  0x1
430
431#define E1_MAKEFUNCTION(t, s) (((t) & 0xf) << 4 | ((s) & 0xf))
432#define E4_MAKEFUNCTION(t, st, s) (((t) & 0xf) << 8 | \
433	((st) & 0xf) << 4 | ((s) & 0xf))
434
435#define E1_MAKESA(a, b, c, d)						\
436	(((c) & 0xff) << 24 |						\
437	 ((d) & 0xff) << 16 |						\
438	 ((a) & 0xff) << 8  |						\
439	 ((b) & 0xff))
440
441#define E1_GETSA1(a) ((a >> 8) & 0xff)
442#define E1_GETSA2(a) (a & 0xff)
443#define E1_GETSA3(a) ((a >> 24) & 0xff)
444#define E1_GETSA4(a) ((a >> 16) & 0xff)
445
446#define E1_SA_CNTL E1_MAKESA('C', 'N', 'T', 'L')
447#define E1_SA_DIAG E1_MAKESA('D', 'I', 'A', 'G')
448#define E1_SA_INFO E1_MAKESA('I', 'N', 'F', 'O')
449#define E1_SA_OPTN E1_MAKESA('O', 'P', 'T', 'N')
450#define E1_SA_RATE E1_MAKESA('R', 'A', 'T', 'E')
451#define E1_SA_STAT E1_MAKESA('S', 'T', 'A', 'T')
452
453#define E4_SA_CNTL 1
454#define E4_SA_STAT 2
455#define E4_SA_INFO 3
456#define E4_SA_TEST 4
457#define E4_SA_OPTN 5
458#define E4_SA_RATE 6
459#define E4_SA_DIAG 7
460#define E4_SA_CNFG 8
461
462/* structures representing a CMV (Configuration and Management Variable) */
463struct cmv_e1 {
464	__le16 wPreamble;
465	__u8 bDirection;
466	__u8 bFunction;
467	__le16 wIndex;
468	__le32 dwSymbolicAddress;
469	__le16 wOffsetAddress;
470	__le32 dwData;
471} __attribute__ ((packed));
472
473struct cmv_e4 {
474	__be16 wGroup;
475	__be16 wFunction;
476	__be16 wOffset;
477	__be16 wAddress;
478	__be32 dwData[6];
479} __attribute__ ((packed));
480
481/* structures representing swap information */
482struct swap_info_e1 {
483	__u8 bSwapPageNo;
484	__u8 bOvl;		/* overlay */
485} __attribute__ ((packed));
486
487struct swap_info_e4 {
488	__u8 bSwapPageNo;
489} __attribute__ ((packed));
490
491/* structures representing interrupt data */
492#define e1_bSwapPageNo	u.e1.s1.swapinfo.bSwapPageNo
493#define e1_bOvl		u.e1.s1.swapinfo.bOvl
494#define e4_bSwapPageNo  u.e4.s1.swapinfo.bSwapPageNo
495
496#define INT_LOADSWAPPAGE 0x0001
497#define INT_INCOMINGCMV  0x0002
498
499union intr_data_e1 {
500	struct {
501		struct swap_info_e1 swapinfo;
502		__le16 wDataSize;
503	} __attribute__ ((packed)) s1;
504	struct {
505		struct cmv_e1 cmv;
506		__le16 wDataSize;
507	} __attribute__ ((packed)) s2;
508} __attribute__ ((packed));
509
510union intr_data_e4 {
511	struct {
512		struct swap_info_e4 swapinfo;
513		__le16 wDataSize;
514	} __attribute__ ((packed)) s1;
515	struct {
516		struct cmv_e4 cmv;
517		__le16 wDataSize;
518	} __attribute__ ((packed)) s2;
519} __attribute__ ((packed));
520
521struct intr_pkt {
522	__u8 bType;
523	__u8 bNotification;
524	__le16 wValue;
525	__le16 wIndex;
526	__le16 wLength;
527	__le16 wInterrupt;
528	union {
529		union intr_data_e1 e1;
530		union intr_data_e4 e4;
531	} u;
532} __attribute__ ((packed));
533
534#define E1_INTR_PKT_SIZE 28
535#define E4_INTR_PKT_SIZE 64
536
537static struct usb_driver uea_driver;
538static DEFINE_MUTEX(uea_mutex);
539static const char *chip_name[] = {"ADI930", "Eagle I", "Eagle II", "Eagle III",
540								"Eagle IV"};
541
542static int modem_index;
543static unsigned int debug;
544static unsigned int altsetting[NB_MODEM] = {
545				[0 ... (NB_MODEM - 1)] = FASTEST_ISO_INTF};
546static int sync_wait[NB_MODEM];
547static char *cmv_file[NB_MODEM];
548static int annex[NB_MODEM];
549
550module_param(debug, uint, 0644);
551MODULE_PARM_DESC(debug, "module debug level (0=off,1=on,2=verbose)");
552module_param_array(altsetting, uint, NULL, 0644);
553MODULE_PARM_DESC(altsetting, "alternate setting for incoming traffic: 0=bulk, "
554			     "1=isoc slowest, ... , 8=isoc fastest (default)");
555module_param_array(sync_wait, bool, NULL, 0644);
556MODULE_PARM_DESC(sync_wait, "wait the synchronisation before starting ATM");
557module_param_array(cmv_file, charp, NULL, 0644);
558MODULE_PARM_DESC(cmv_file,
559		"file name with configuration and management variables");
560module_param_array(annex, uint, NULL, 0644);
561MODULE_PARM_DESC(annex,
562		"manually set annex a/b (0=auto, 1=annex a, 2=annex b)");
563
564#define uea_wait(sc, cond, timeo) \
565({ \
566	int _r = wait_event_interruptible_timeout(sc->sync_q, \
567			(cond) || kthread_should_stop(), timeo); \
568	if (kthread_should_stop()) \
569		_r = -ENODEV; \
570	_r; \
571})
572
573#define UPDATE_ATM_STAT(type, val) \
574	do { \
575		if (sc->usbatm->atm_dev) \
576			sc->usbatm->atm_dev->type = val; \
577	} while (0)
578
579#define UPDATE_ATM_SIGNAL(val) \
580	do { \
581		if (sc->usbatm->atm_dev) \
582			atm_dev_signal_change(sc->usbatm->atm_dev, val); \
583	} while (0)
584
585
586/* Firmware loading */
587#define LOAD_INTERNAL     0xA0
588#define F8051_USBCS       0x7f92
589
590/**
591 * uea_send_modem_cmd - Send a command for pre-firmware devices.
592 */
593static int uea_send_modem_cmd(struct usb_device *usb,
594			      u16 addr, u16 size, const u8 *buff)
595{
596	int ret = -ENOMEM;
597	u8 *xfer_buff;
598
599	xfer_buff = kmemdup(buff, size, GFP_KERNEL);
600	if (xfer_buff) {
601		ret = usb_control_msg(usb,
602				      usb_sndctrlpipe(usb, 0),
603				      LOAD_INTERNAL,
604				      USB_DIR_OUT | USB_TYPE_VENDOR |
605				      USB_RECIP_DEVICE, addr, 0, xfer_buff,
606				      size, CTRL_TIMEOUT);
607		kfree(xfer_buff);
608	}
609
610	if (ret < 0)
611		return ret;
612
613	return (ret == size) ? 0 : -EIO;
614}
615
616static void uea_upload_pre_firmware(const struct firmware *fw_entry,
617								void *context)
618{
619	struct usb_device *usb = context;
620	const u8 *pfw;
621	u8 value;
622	u32 crc = 0;
623	int ret, size;
624
625	uea_enters(usb);
626	if (!fw_entry) {
627		uea_err(usb, "firmware is not available\n");
628		goto err;
629	}
630
631	pfw = fw_entry->data;
632	size = fw_entry->size;
633	if (size < 4)
634		goto err_fw_corrupted;
635
636	crc = get_unaligned_le32(pfw);
637	pfw += 4;
638	size -= 4;
639	if (crc32_be(0, pfw, size) != crc)
640		goto err_fw_corrupted;
641
642	/*
643	 * Start to upload firmware : send reset
644	 */
645	value = 1;
646	ret = uea_send_modem_cmd(usb, F8051_USBCS, sizeof(value), &value);
647
648	if (ret < 0) {
649		uea_err(usb, "modem reset failed with error %d\n", ret);
650		goto err;
651	}
652
653	while (size > 3) {
654		u8 len = FW_GET_BYTE(pfw);
655		u16 add = get_unaligned_le16(pfw + 1);
656
657		size -= len + 3;
658		if (size < 0)
659			goto err_fw_corrupted;
660
661		ret = uea_send_modem_cmd(usb, add, len, pfw + 3);
662		if (ret < 0) {
663			uea_err(usb, "uploading firmware data failed "
664					"with error %d\n", ret);
665			goto err;
666		}
667		pfw += len + 3;
668	}
669
670	if (size != 0)
671		goto err_fw_corrupted;
672
673	/*
674	 * Tell the modem we finish : de-assert reset
675	 */
676	value = 0;
677	ret = uea_send_modem_cmd(usb, F8051_USBCS, 1, &value);
678	if (ret < 0)
679		uea_err(usb, "modem de-assert failed with error %d\n", ret);
680	else
681		uea_info(usb, "firmware uploaded\n");
682
683	goto err;
684
685err_fw_corrupted:
686	uea_err(usb, "firmware is corrupted\n");
687err:
688	release_firmware(fw_entry);
689	uea_leaves(usb);
690}
691
692/**
693 * uea_load_firmware - Load usb firmware for pre-firmware devices.
694 */
695static int uea_load_firmware(struct usb_device *usb, unsigned int ver)
696{
697	int ret;
698	char *fw_name = FW_DIR "eagle.fw";
699
700	uea_enters(usb);
701	uea_info(usb, "pre-firmware device, uploading firmware\n");
702
703	switch (ver) {
704	case ADI930:
705		fw_name = FW_DIR "adi930.fw";
706		break;
707	case EAGLE_I:
708		fw_name = FW_DIR "eagleI.fw";
709		break;
710	case EAGLE_II:
711		fw_name = FW_DIR "eagleII.fw";
712		break;
713	case EAGLE_III:
714		fw_name = FW_DIR "eagleIII.fw";
715		break;
716	case EAGLE_IV:
717		fw_name = FW_DIR "eagleIV.fw";
718		break;
719	}
720
721	ret = request_firmware_nowait(THIS_MODULE, 1, fw_name, &usb->dev,
722					GFP_KERNEL, usb,
723					uea_upload_pre_firmware);
724	if (ret)
725		uea_err(usb, "firmware %s is not available\n", fw_name);
726	else
727		uea_info(usb, "loading firmware %s\n", fw_name);
728
729	uea_leaves(usb);
730	return ret;
731}
732
733/* modem management : dsp firmware, send/read CMV, monitoring statistic
734 */
735
736/*
737 * Make sure that the DSP code provided is safe to use.
738 */
739static int check_dsp_e1(const u8 *dsp, unsigned int len)
740{
741	u8 pagecount, blockcount;
742	u16 blocksize;
743	u32 pageoffset;
744	unsigned int i, j, p, pp;
745
746	pagecount = FW_GET_BYTE(dsp);
747	p = 1;
748
749	/* enough space for page offsets? */
750	if (p + 4 * pagecount > len)
751		return 1;
752
753	for (i = 0; i < pagecount; i++) {
754
755		pageoffset = get_unaligned_le32(dsp + p);
756		p += 4;
757
758		if (pageoffset == 0)
759			continue;
760
761		/* enough space for blockcount? */
762		if (pageoffset >= len)
763			return 1;
764
765		pp = pageoffset;
766		blockcount = FW_GET_BYTE(dsp + pp);
767		pp += 1;
768
769		for (j = 0; j < blockcount; j++) {
770
771			/* enough space for block header? */
772			if (pp + 4 > len)
773				return 1;
774
775			pp += 2;	/* skip blockaddr */
776			blocksize = get_unaligned_le16(dsp + pp);
777			pp += 2;
778
779			/* enough space for block data? */
780			if (pp + blocksize > len)
781				return 1;
782
783			pp += blocksize;
784		}
785	}
786
787	return 0;
788}
789
790static int check_dsp_e4(const u8 *dsp, int len)
791{
792	int i;
793	struct l1_code *p = (struct l1_code *) dsp;
794	unsigned int sum = p->code - dsp;
795
796	if (len < sum)
797		return 1;
798
799	if (strcmp("STRATIPHY ANEXA", p->string_header) != 0 &&
800	    strcmp("STRATIPHY ANEXB", p->string_header) != 0)
801		return 1;
802
803	for (i = 0; i < E4_MAX_PAGE_NUMBER; i++) {
804		struct block_index *blockidx;
805		u8 blockno = p->page_number_to_block_index[i];
806		if (blockno >= E4_NO_SWAPPAGE_HEADERS)
807			continue;
808
809		do {
810			u64 l;
811
812			if (blockno >= E4_NO_SWAPPAGE_HEADERS)
813				return 1;
814
815			blockidx = &p->page_header[blockno++];
816			if ((u8 *)(blockidx + 1) - dsp  >= len)
817				return 1;
818
819			if (le16_to_cpu(blockidx->PageNumber) != i)
820				return 1;
821
822			l = E4_PAGE_BYTES(blockidx->PageSize);
823			sum += l;
824			l += le32_to_cpu(blockidx->PageOffset);
825			if (l > len)
826				return 1;
827
828		/* zero is zero regardless endianes */
829		} while (blockidx->NotLastBlock);
830	}
831
832	return (sum == len) ? 0 : 1;
833}
834
835/*
836 * send data to the idma pipe
837 * */
838static int uea_idma_write(struct uea_softc *sc, const void *data, u32 size)
839{
840	int ret = -ENOMEM;
841	u8 *xfer_buff;
842	int bytes_read;
843
844	xfer_buff = kmemdup(data, size, GFP_KERNEL);
845	if (!xfer_buff) {
846		uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n");
847		return ret;
848	}
849
850	ret = usb_bulk_msg(sc->usb_dev,
851			 usb_sndbulkpipe(sc->usb_dev, UEA_IDMA_PIPE),
852			 xfer_buff, size, &bytes_read, BULK_TIMEOUT);
853
854	kfree(xfer_buff);
855	if (ret < 0)
856		return ret;
857	if (size != bytes_read) {
858		uea_err(INS_TO_USBDEV(sc), "size != bytes_read %d %d\n", size,
859		       bytes_read);
860		return -EIO;
861	}
862
863	return 0;
864}
865
866static int request_dsp(struct uea_softc *sc)
867{
868	int ret;
869	char *dsp_name;
870
871	if (UEA_CHIP_VERSION(sc) == EAGLE_IV) {
872		if (IS_ISDN(sc))
873			dsp_name = FW_DIR "DSP4i.bin";
874		else
875			dsp_name = FW_DIR "DSP4p.bin";
876	} else if (UEA_CHIP_VERSION(sc) == ADI930) {
877		if (IS_ISDN(sc))
878			dsp_name = FW_DIR "DSP9i.bin";
879		else
880			dsp_name = FW_DIR "DSP9p.bin";
881	} else {
882		if (IS_ISDN(sc))
883			dsp_name = FW_DIR "DSPei.bin";
884		else
885			dsp_name = FW_DIR "DSPep.bin";
886	}
887
888	ret = request_firmware(&sc->dsp_firm, dsp_name, &sc->usb_dev->dev);
889	if (ret < 0) {
890		uea_err(INS_TO_USBDEV(sc),
891		       "requesting firmware %s failed with error %d\n",
892			dsp_name, ret);
893		return ret;
894	}
895
896	if (UEA_CHIP_VERSION(sc) == EAGLE_IV)
897		ret = check_dsp_e4(sc->dsp_firm->data, sc->dsp_firm->size);
898	else
899		ret = check_dsp_e1(sc->dsp_firm->data, sc->dsp_firm->size);
900
901	if (ret) {
902		uea_err(INS_TO_USBDEV(sc), "firmware %s is corrupted\n",
903		       dsp_name);
904		release_firmware(sc->dsp_firm);
905		sc->dsp_firm = NULL;
906		return -EILSEQ;
907	}
908
909	return 0;
910}
911
912/*
913 * The uea_load_page() function must be called within a process context
914 */
915static void uea_load_page_e1(struct work_struct *work)
916{
917	struct uea_softc *sc = container_of(work, struct uea_softc, task);
918	u16 pageno = sc->pageno;
919	u16 ovl = sc->ovl;
920	struct block_info_e1 bi;
921
922	const u8 *p;
923	u8 pagecount, blockcount;
924	u16 blockaddr, blocksize;
925	u32 pageoffset;
926	int i;
927
928	/* reload firmware when reboot start and it's loaded already */
929	if (ovl == 0 && pageno == 0 && sc->dsp_firm) {
930		release_firmware(sc->dsp_firm);
931		sc->dsp_firm = NULL;
932	}
933
934	if (sc->dsp_firm == NULL && request_dsp(sc) < 0)
935		return;
936
937	p = sc->dsp_firm->data;
938	pagecount = FW_GET_BYTE(p);
939	p += 1;
940
941	if (pageno >= pagecount)
942		goto bad1;
943
944	p += 4 * pageno;
945	pageoffset = get_unaligned_le32(p);
946
947	if (pageoffset == 0)
948		goto bad1;
949
950	p = sc->dsp_firm->data + pageoffset;
951	blockcount = FW_GET_BYTE(p);
952	p += 1;
953
954	uea_dbg(INS_TO_USBDEV(sc),
955	       "sending %u blocks for DSP page %u\n", blockcount, pageno);
956
957	bi.wHdr = cpu_to_le16(UEA_BIHDR);
958	bi.wOvl = cpu_to_le16(ovl);
959	bi.wOvlOffset = cpu_to_le16(ovl | 0x8000);
960
961	for (i = 0; i < blockcount; i++) {
962		blockaddr = get_unaligned_le16(p);
963		p += 2;
964
965		blocksize = get_unaligned_le16(p);
966		p += 2;
967
968		bi.wSize = cpu_to_le16(blocksize);
969		bi.wAddress = cpu_to_le16(blockaddr);
970		bi.wLast = cpu_to_le16((i == blockcount - 1) ? 1 : 0);
971
972		/* send block info through the IDMA pipe */
973		if (uea_idma_write(sc, &bi, E1_BLOCK_INFO_SIZE))
974			goto bad2;
975
976		/* send block data through the IDMA pipe */
977		if (uea_idma_write(sc, p, blocksize))
978			goto bad2;
979
980		p += blocksize;
981	}
982
983	return;
984
985bad2:
986	uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", i);
987	return;
988bad1:
989	uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n", pageno);
990}
991
992static void __uea_load_page_e4(struct uea_softc *sc, u8 pageno, int boot)
993{
994	struct block_info_e4 bi;
995	struct block_index *blockidx;
996	struct l1_code *p = (struct l1_code *) sc->dsp_firm->data;
997	u8 blockno = p->page_number_to_block_index[pageno];
998
999	bi.wHdr = cpu_to_be16(UEA_BIHDR);
1000	bi.bBootPage = boot;
1001	bi.bPageNumber = pageno;
1002	bi.wReserved = cpu_to_be16(UEA_RESERVED);
1003
1004	do {
1005		const u8 *blockoffset;
1006		unsigned int blocksize;
1007
1008		blockidx = &p->page_header[blockno];
1009		blocksize = E4_PAGE_BYTES(blockidx->PageSize);
1010		blockoffset = sc->dsp_firm->data + le32_to_cpu(
1011							blockidx->PageOffset);
1012
1013		bi.dwSize = cpu_to_be32(blocksize);
1014		bi.dwAddress = cpu_to_be32(le32_to_cpu(blockidx->PageAddress));
1015
1016		uea_dbg(INS_TO_USBDEV(sc),
1017			"sending block %u for DSP page "
1018			"%u size %u address %x\n",
1019			blockno, pageno, blocksize,
1020			le32_to_cpu(blockidx->PageAddress));
1021
1022		/* send block info through the IDMA pipe */
1023		if (uea_idma_write(sc, &bi, E4_BLOCK_INFO_SIZE))
1024			goto bad;
1025
1026		/* send block data through the IDMA pipe */
1027		if (uea_idma_write(sc, blockoffset, blocksize))
1028			goto bad;
1029
1030		blockno++;
1031	} while (blockidx->NotLastBlock);
1032
1033	return;
1034
1035bad:
1036	uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", blockno);
1037	return;
1038}
1039
1040static void uea_load_page_e4(struct work_struct *work)
1041{
1042	struct uea_softc *sc = container_of(work, struct uea_softc, task);
1043	u8 pageno = sc->pageno;
1044	int i;
1045	struct block_info_e4 bi;
1046	struct l1_code *p;
1047
1048	uea_dbg(INS_TO_USBDEV(sc), "sending DSP page %u\n", pageno);
1049
1050	/* reload firmware when reboot start and it's loaded already */
1051	if (pageno == 0 && sc->dsp_firm) {
1052		release_firmware(sc->dsp_firm);
1053		sc->dsp_firm = NULL;
1054	}
1055
1056	if (sc->dsp_firm == NULL && request_dsp(sc) < 0)
1057		return;
1058
1059	p = (struct l1_code *) sc->dsp_firm->data;
1060	if (pageno >= le16_to_cpu(p->page_header[0].PageNumber)) {
1061		uea_err(INS_TO_USBDEV(sc), "invalid DSP "
1062						"page %u requested\n", pageno);
1063		return;
1064	}
1065
1066	if (pageno != 0) {
1067		__uea_load_page_e4(sc, pageno, 0);
1068		return;
1069	}
1070
1071	uea_dbg(INS_TO_USBDEV(sc),
1072	       "sending Main DSP page %u\n", p->page_header[0].PageNumber);
1073
1074	for (i = 0; i < le16_to_cpu(p->page_header[0].PageNumber); i++) {
1075		if (E4_IS_BOOT_PAGE(p->page_header[i].PageSize))
1076			__uea_load_page_e4(sc, i, 1);
1077	}
1078
1079	uea_dbg(INS_TO_USBDEV(sc) , "sending start bi\n");
1080
1081	bi.wHdr = cpu_to_be16(UEA_BIHDR);
1082	bi.bBootPage = 0;
1083	bi.bPageNumber = 0xff;
1084	bi.wReserved = cpu_to_be16(UEA_RESERVED);
1085	bi.dwSize = cpu_to_be32(E4_PAGE_BYTES(p->page_header[0].PageSize));
1086	bi.dwAddress = cpu_to_be32(le32_to_cpu(p->page_header[0].PageAddress));
1087
1088	/* send block info through the IDMA pipe */
1089	if (uea_idma_write(sc, &bi, E4_BLOCK_INFO_SIZE))
1090		uea_err(INS_TO_USBDEV(sc), "sending DSP start bi failed\n");
1091}
1092
1093static inline void wake_up_cmv_ack(struct uea_softc *sc)
1094{
1095	BUG_ON(sc->cmv_ack);
1096	sc->cmv_ack = 1;
1097	wake_up(&sc->sync_q);
1098}
1099
1100static inline int wait_cmv_ack(struct uea_softc *sc)
1101{
1102	int ret = uea_wait(sc, sc->cmv_ack , ACK_TIMEOUT);
1103
1104	sc->cmv_ack = 0;
1105
1106	uea_dbg(INS_TO_USBDEV(sc), "wait_event_timeout : %d ms\n",
1107			jiffies_to_msecs(ret));
1108
1109	if (ret < 0)
1110		return ret;
1111
1112	return (ret == 0) ? -ETIMEDOUT : 0;
1113}
1114
1115#define UCDC_SEND_ENCAPSULATED_COMMAND 0x00
1116
1117static int uea_request(struct uea_softc *sc,
1118		u16 value, u16 index, u16 size, const void *data)
1119{
1120	u8 *xfer_buff;
1121	int ret = -ENOMEM;
1122
1123	xfer_buff = kmemdup(data, size, GFP_KERNEL);
1124	if (!xfer_buff) {
1125		uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n");
1126		return ret;
1127	}
1128
1129	ret = usb_control_msg(sc->usb_dev, usb_sndctrlpipe(sc->usb_dev, 0),
1130			      UCDC_SEND_ENCAPSULATED_COMMAND,
1131			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1132			      value, index, xfer_buff, size, CTRL_TIMEOUT);
1133
1134	kfree(xfer_buff);
1135	if (ret < 0) {
1136		uea_err(INS_TO_USBDEV(sc), "usb_control_msg error %d\n", ret);
1137		return ret;
1138	}
1139
1140	if (ret != size) {
1141		uea_err(INS_TO_USBDEV(sc),
1142		       "usb_control_msg send only %d bytes (instead of %d)\n",
1143		       ret, size);
1144		return -EIO;
1145	}
1146
1147	return 0;
1148}
1149
1150static int uea_cmv_e1(struct uea_softc *sc,
1151		u8 function, u32 address, u16 offset, u32 data)
1152{
1153	struct cmv_e1 cmv;
1154	int ret;
1155
1156	uea_enters(INS_TO_USBDEV(sc));
1157	uea_vdbg(INS_TO_USBDEV(sc), "Function : %d-%d, Address : %c%c%c%c, "
1158			"offset : 0x%04x, data : 0x%08x\n",
1159			E1_FUNCTION_TYPE(function),
1160			E1_FUNCTION_SUBTYPE(function),
1161			E1_GETSA1(address), E1_GETSA2(address),
1162			E1_GETSA3(address),
1163			E1_GETSA4(address), offset, data);
1164
1165	/* we send a request, but we expect a reply */
1166	sc->cmv_dsc.e1.function = function | 0x2;
1167	sc->cmv_dsc.e1.idx++;
1168	sc->cmv_dsc.e1.address = address;
1169	sc->cmv_dsc.e1.offset = offset;
1170
1171	cmv.wPreamble = cpu_to_le16(E1_PREAMBLE);
1172	cmv.bDirection = E1_HOSTTOMODEM;
1173	cmv.bFunction = function;
1174	cmv.wIndex = cpu_to_le16(sc->cmv_dsc.e1.idx);
1175	put_unaligned_le32(address, &cmv.dwSymbolicAddress);
1176	cmv.wOffsetAddress = cpu_to_le16(offset);
1177	put_unaligned_le32(data >> 16 | data << 16, &cmv.dwData);
1178
1179	ret = uea_request(sc, UEA_E1_SET_BLOCK, UEA_MPTX_START,
1180							sizeof(cmv), &cmv);
1181	if (ret < 0)
1182		return ret;
1183	ret = wait_cmv_ack(sc);
1184	uea_leaves(INS_TO_USBDEV(sc));
1185	return ret;
1186}
1187
1188static int uea_cmv_e4(struct uea_softc *sc,
1189		u16 function, u16 group, u16 address, u16 offset, u32 data)
1190{
1191	struct cmv_e4 cmv;
1192	int ret;
1193
1194	uea_enters(INS_TO_USBDEV(sc));
1195	memset(&cmv, 0, sizeof(cmv));
1196
1197	uea_vdbg(INS_TO_USBDEV(sc), "Function : %d-%d, Group : 0x%04x, "
1198		 "Address : 0x%04x, offset : 0x%04x, data : 0x%08x\n",
1199		 E4_FUNCTION_TYPE(function), E4_FUNCTION_SUBTYPE(function),
1200		 group, address, offset, data);
1201
1202	/* we send a request, but we expect a reply */
1203	sc->cmv_dsc.e4.function = function | (0x1 << 4);
1204	sc->cmv_dsc.e4.offset = offset;
1205	sc->cmv_dsc.e4.address = address;
1206	sc->cmv_dsc.e4.group = group;
1207
1208	cmv.wFunction = cpu_to_be16(function);
1209	cmv.wGroup = cpu_to_be16(group);
1210	cmv.wAddress = cpu_to_be16(address);
1211	cmv.wOffset = cpu_to_be16(offset);
1212	cmv.dwData[0] = cpu_to_be32(data);
1213
1214	ret = uea_request(sc, UEA_E4_SET_BLOCK, UEA_MPTX_START,
1215							sizeof(cmv), &cmv);
1216	if (ret < 0)
1217		return ret;
1218	ret = wait_cmv_ack(sc);
1219	uea_leaves(INS_TO_USBDEV(sc));
1220	return ret;
1221}
1222
1223static inline int uea_read_cmv_e1(struct uea_softc *sc,
1224		u32 address, u16 offset, u32 *data)
1225{
1226	int ret = uea_cmv_e1(sc, E1_MAKEFUNCTION(E1_MEMACCESS, E1_REQUESTREAD),
1227			  address, offset, 0);
1228	if (ret < 0)
1229		uea_err(INS_TO_USBDEV(sc),
1230			"reading cmv failed with error %d\n", ret);
1231	else
1232		*data = sc->data;
1233
1234	return ret;
1235}
1236
1237static inline int uea_read_cmv_e4(struct uea_softc *sc,
1238		u8 size, u16 group, u16 address, u16 offset, u32 *data)
1239{
1240	int ret = uea_cmv_e4(sc, E4_MAKEFUNCTION(E4_MEMACCESS,
1241							E4_REQUESTREAD, size),
1242			  group, address, offset, 0);
1243	if (ret < 0)
1244		uea_err(INS_TO_USBDEV(sc),
1245			"reading cmv failed with error %d\n", ret);
1246	else {
1247		*data = sc->data;
1248		/* size is in 16-bit word quantities */
1249		if (size > 2)
1250			*(data + 1) = sc->data1;
1251	}
1252	return ret;
1253}
1254
1255static inline int uea_write_cmv_e1(struct uea_softc *sc,
1256		u32 address, u16 offset, u32 data)
1257{
1258	int ret = uea_cmv_e1(sc, E1_MAKEFUNCTION(E1_MEMACCESS, E1_REQUESTWRITE),
1259			  address, offset, data);
1260	if (ret < 0)
1261		uea_err(INS_TO_USBDEV(sc),
1262			"writing cmv failed with error %d\n", ret);
1263
1264	return ret;
1265}
1266
1267static inline int uea_write_cmv_e4(struct uea_softc *sc,
1268		u8 size, u16 group, u16 address, u16 offset, u32 data)
1269{
1270	int ret = uea_cmv_e4(sc, E4_MAKEFUNCTION(E4_MEMACCESS,
1271							E4_REQUESTWRITE, size),
1272			  group, address, offset, data);
1273	if (ret < 0)
1274		uea_err(INS_TO_USBDEV(sc),
1275			"writing cmv failed with error %d\n", ret);
1276
1277	return ret;
1278}
1279
1280static void uea_set_bulk_timeout(struct uea_softc *sc, u32 dsrate)
1281{
1282	int ret;
1283	u16 timeout;
1284
1285	/* in bulk mode the modem have problem with high rate
1286	 * changing internal timing could improve things, but the
1287	 * value is misterious.
1288	 * ADI930 don't support it (-EPIPE error).
1289	 */
1290
1291	if (UEA_CHIP_VERSION(sc) == ADI930 ||
1292	    altsetting[sc->modem_index] > 0 ||
1293	    sc->stats.phy.dsrate == dsrate)
1294		return;
1295
1296	/* Original timming (1Mbit/s) from ADI (used in windows driver) */
1297	timeout = (dsrate <= 1024*1024) ? 0 : 1;
1298	ret = uea_request(sc, UEA_SET_TIMEOUT, timeout, 0, NULL);
1299	uea_info(INS_TO_USBDEV(sc), "setting new timeout %d%s\n",
1300		 timeout,  ret < 0 ? " failed" : "");
1301
1302}
1303
1304/*
1305 * Monitor the modem and update the stat
1306 * return 0 if everything is ok
1307 * return < 0 if an error occurs (-EAGAIN reboot needed)
1308 */
1309static int uea_stat_e1(struct uea_softc *sc)
1310{
1311	u32 data;
1312	int ret;
1313
1314	uea_enters(INS_TO_USBDEV(sc));
1315	data = sc->stats.phy.state;
1316
1317	ret = uea_read_cmv_e1(sc, E1_SA_STAT, 0, &sc->stats.phy.state);
1318	if (ret < 0)
1319		return ret;
1320
1321	switch (GET_STATUS(sc->stats.phy.state)) {
1322	case 0:		/* not yet synchronized */
1323		uea_dbg(INS_TO_USBDEV(sc),
1324		       "modem not yet synchronized\n");
1325		return 0;
1326
1327	case 1:		/* initialization */
1328		uea_dbg(INS_TO_USBDEV(sc), "modem initializing\n");
1329		return 0;
1330
1331	case 2:		/* operational */
1332		uea_vdbg(INS_TO_USBDEV(sc), "modem operational\n");
1333		break;
1334
1335	case 3:		/* fail ... */
1336		uea_info(INS_TO_USBDEV(sc), "modem synchronization failed"
1337					" (may be try other cmv/dsp)\n");
1338		return -EAGAIN;
1339
1340	case 4 ... 6:	/* test state */
1341		uea_warn(INS_TO_USBDEV(sc),
1342				"modem in test mode - not supported\n");
1343		return -EAGAIN;
1344
1345	case 7:		/* fast-retain ... */
1346		uea_info(INS_TO_USBDEV(sc), "modem in fast-retain mode\n");
1347		return 0;
1348	default:
1349		uea_err(INS_TO_USBDEV(sc), "modem invalid SW mode %d\n",
1350			GET_STATUS(sc->stats.phy.state));
1351		return -EAGAIN;
1352	}
1353
1354	if (GET_STATUS(data) != 2) {
1355		uea_request(sc, UEA_SET_MODE, UEA_LOOPBACK_OFF, 0, NULL);
1356		uea_info(INS_TO_USBDEV(sc), "modem operational\n");
1357
1358		/* release the dsp firmware as it is not needed until
1359		 * the next failure
1360		 */
1361		if (sc->dsp_firm) {
1362			release_firmware(sc->dsp_firm);
1363			sc->dsp_firm = NULL;
1364		}
1365	}
1366
1367	/* always update it as atm layer could not be init when we switch to
1368	 * operational state
1369	 */
1370	UPDATE_ATM_SIGNAL(ATM_PHY_SIG_FOUND);
1371
1372	/* wake up processes waiting for synchronization */
1373	wake_up(&sc->sync_q);
1374
1375	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 2, &sc->stats.phy.flags);
1376	if (ret < 0)
1377		return ret;
1378	sc->stats.phy.mflags |= sc->stats.phy.flags;
1379
1380	/* in case of a flags ( for example delineation LOSS (& 0x10)),
1381	 * we check the status again in order to detect the failure earlier
1382	 */
1383	if (sc->stats.phy.flags) {
1384		uea_dbg(INS_TO_USBDEV(sc), "Stat flag = 0x%x\n",
1385		       sc->stats.phy.flags);
1386		return 0;
1387	}
1388
1389	ret = uea_read_cmv_e1(sc, E1_SA_RATE, 0, &data);
1390	if (ret < 0)
1391		return ret;
1392
1393	uea_set_bulk_timeout(sc, (data >> 16) * 32);
1394	sc->stats.phy.dsrate = (data >> 16) * 32;
1395	sc->stats.phy.usrate = (data & 0xffff) * 32;
1396	UPDATE_ATM_STAT(link_rate, sc->stats.phy.dsrate * 1000 / 424);
1397
1398	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 23, &data);
1399	if (ret < 0)
1400		return ret;
1401	sc->stats.phy.dsattenuation = (data & 0xff) / 2;
1402
1403	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 47, &data);
1404	if (ret < 0)
1405		return ret;
1406	sc->stats.phy.usattenuation = (data & 0xff) / 2;
1407
1408	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 25, &sc->stats.phy.dsmargin);
1409	if (ret < 0)
1410		return ret;
1411
1412	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 49, &sc->stats.phy.usmargin);
1413	if (ret < 0)
1414		return ret;
1415
1416	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 51, &sc->stats.phy.rxflow);
1417	if (ret < 0)
1418		return ret;
1419
1420	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 52, &sc->stats.phy.txflow);
1421	if (ret < 0)
1422		return ret;
1423
1424	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 54, &sc->stats.phy.dsunc);
1425	if (ret < 0)
1426		return ret;
1427
1428	/* only for atu-c */
1429	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 58, &sc->stats.phy.usunc);
1430	if (ret < 0)
1431		return ret;
1432
1433	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 53, &sc->stats.phy.dscorr);
1434	if (ret < 0)
1435		return ret;
1436
1437	/* only for atu-c */
1438	ret = uea_read_cmv_e1(sc, E1_SA_DIAG, 57, &sc->stats.phy.uscorr);
1439	if (ret < 0)
1440		return ret;
1441
1442	ret = uea_read_cmv_e1(sc, E1_SA_INFO, 8, &sc->stats.phy.vidco);
1443	if (ret < 0)
1444		return ret;
1445
1446	ret = uea_read_cmv_e1(sc, E1_SA_INFO, 13, &sc->stats.phy.vidcpe);
1447	if (ret < 0)
1448		return ret;
1449
1450	return 0;
1451}
1452
1453static int uea_stat_e4(struct uea_softc *sc)
1454{
1455	u32 data;
1456	u32 tmp_arr[2];
1457	int ret;
1458
1459	uea_enters(INS_TO_USBDEV(sc));
1460	data = sc->stats.phy.state;
1461
1462	ret = uea_read_cmv_e4(sc, 1, E4_SA_STAT, 0, 0, &sc->stats.phy.state);
1463	if (ret < 0)
1464		return ret;
1465
1466	switch (sc->stats.phy.state) {
1467	case 0x0:	/* not yet synchronized */
1468	case 0x1:
1469	case 0x3:
1470	case 0x4:
1471		uea_dbg(INS_TO_USBDEV(sc), "modem not yet "
1472						"synchronized\n");
1473		return 0;
1474	case 0x5:	/* initialization */
1475	case 0x6:
1476	case 0x9:
1477	case 0xa:
1478		uea_dbg(INS_TO_USBDEV(sc), "modem initializing\n");
1479		return 0;
1480	case 0x2:	/* fail ... */
1481		uea_info(INS_TO_USBDEV(sc), "modem synchronization "
1482				"failed (may be try other cmv/dsp)\n");
1483		return -EAGAIN;
1484	case 0x7:	/* operational */
1485		break;
1486	default:
1487		uea_warn(INS_TO_USBDEV(sc), "unknown state: %x\n",
1488						sc->stats.phy.state);
1489		return 0;
1490	}
1491
1492	if (data != 7) {
1493		uea_request(sc, UEA_SET_MODE, UEA_LOOPBACK_OFF, 0, NULL);
1494		uea_info(INS_TO_USBDEV(sc), "modem operational\n");
1495
1496		/* release the dsp firmware as it is not needed until
1497		 * the next failure
1498		 */
1499		if (sc->dsp_firm) {
1500			release_firmware(sc->dsp_firm);
1501			sc->dsp_firm = NULL;
1502		}
1503	}
1504
1505	/* always update it as atm layer could not be init when we switch to
1506	 * operational state
1507	 */
1508	UPDATE_ATM_SIGNAL(ATM_PHY_SIG_FOUND);
1509
1510	/* wake up processes waiting for synchronization */
1511	wake_up(&sc->sync_q);
1512
1513	/* TODO improve this state machine :
1514	 * we need some CMV info : what they do and their unit
1515	 * we should find the equivalent of eagle3- CMV
1516	 */
1517	/* check flags */
1518	ret = uea_read_cmv_e4(sc, 1, E4_SA_DIAG, 0, 0, &sc->stats.phy.flags);
1519	if (ret < 0)
1520		return ret;
1521	sc->stats.phy.mflags |= sc->stats.phy.flags;
1522
1523	/* in case of a flags ( for example delineation LOSS (& 0x10)),
1524	 * we check the status again in order to detect the failure earlier
1525	 */
1526	if (sc->stats.phy.flags) {
1527		uea_dbg(INS_TO_USBDEV(sc), "Stat flag = 0x%x\n",
1528		       sc->stats.phy.flags);
1529		if (sc->stats.phy.flags & 1) /* delineation LOSS */
1530			return -EAGAIN;
1531		if (sc->stats.phy.flags & 0x4000) /* Reset Flag */
1532			return -EAGAIN;
1533		return 0;
1534	}
1535
1536	/* rate data may be in upper or lower half of 64 bit word, strange */
1537	ret = uea_read_cmv_e4(sc, 4, E4_SA_RATE, 0, 0, tmp_arr);
1538	if (ret < 0)
1539		return ret;
1540	data = (tmp_arr[0]) ? tmp_arr[0] : tmp_arr[1];
1541	sc->stats.phy.usrate = data / 1000;
1542
1543	ret = uea_read_cmv_e4(sc, 4, E4_SA_RATE, 1, 0, tmp_arr);
1544	if (ret < 0)
1545		return ret;
1546	data = (tmp_arr[0]) ? tmp_arr[0] : tmp_arr[1];
1547	uea_set_bulk_timeout(sc, data / 1000);
1548	sc->stats.phy.dsrate = data / 1000;
1549	UPDATE_ATM_STAT(link_rate, sc->stats.phy.dsrate * 1000 / 424);
1550
1551	ret = uea_read_cmv_e4(sc, 1, E4_SA_INFO, 68, 1, &data);
1552	if (ret < 0)
1553		return ret;
1554	sc->stats.phy.dsattenuation = data / 10;
1555
1556	ret = uea_read_cmv_e4(sc, 1, E4_SA_INFO, 69, 1, &data);
1557	if (ret < 0)
1558		return ret;
1559	sc->stats.phy.usattenuation = data / 10;
1560
1561	ret = uea_read_cmv_e4(sc, 1, E4_SA_INFO, 68, 3, &data);
1562	if (ret < 0)
1563		return ret;
1564	sc->stats.phy.dsmargin = data / 2;
1565
1566	ret = uea_read_cmv_e4(sc, 1, E4_SA_INFO, 69, 3, &data);
1567	if (ret < 0)
1568		return ret;
1569	sc->stats.phy.usmargin = data / 10;
1570
1571	return 0;
1572}
1573
1574static void cmvs_file_name(struct uea_softc *sc, char *const cmv_name, int ver)
1575{
1576	char file_arr[] = "CMVxy.bin";
1577	char *file;
1578
1579	kparam_block_sysfs_write(cmv_file);
1580	/* set proper name corresponding modem version and line type */
1581	if (cmv_file[sc->modem_index] == NULL) {
1582		if (UEA_CHIP_VERSION(sc) == ADI930)
1583			file_arr[3] = '9';
1584		else if (UEA_CHIP_VERSION(sc) == EAGLE_IV)
1585			file_arr[3] = '4';
1586		else
1587			file_arr[3] = 'e';
1588
1589		file_arr[4] = IS_ISDN(sc) ? 'i' : 'p';
1590		file = file_arr;
1591	} else
1592		file = cmv_file[sc->modem_index];
1593
1594	strcpy(cmv_name, FW_DIR);
1595	strlcat(cmv_name, file, UEA_FW_NAME_MAX);
1596	if (ver == 2)
1597		strlcat(cmv_name, ".v2", UEA_FW_NAME_MAX);
1598	kparam_unblock_sysfs_write(cmv_file);
1599}
1600
1601static int request_cmvs_old(struct uea_softc *sc,
1602		 void **cmvs, const struct firmware **fw)
1603{
1604	int ret, size;
1605	u8 *data;
1606	char cmv_name[UEA_FW_NAME_MAX]; /* 30 bytes stack variable */
1607
1608	cmvs_file_name(sc, cmv_name, 1);
1609	ret = request_firmware(fw, cmv_name, &sc->usb_dev->dev);
1610	if (ret < 0) {
1611		uea_err(INS_TO_USBDEV(sc),
1612		       "requesting firmware %s failed with error %d\n",
1613		       cmv_name, ret);
1614		return ret;
1615	}
1616
1617	data = (u8 *) (*fw)->data;
1618	size = (*fw)->size;
1619	if (size < 1)
1620		goto err_fw_corrupted;
1621
1622	if (size != *data * sizeof(struct uea_cmvs_v1) + 1)
1623		goto err_fw_corrupted;
1624
1625	*cmvs = (void *)(data + 1);
1626	return *data;
1627
1628err_fw_corrupted:
1629	uea_err(INS_TO_USBDEV(sc), "firmware %s is corrupted\n", cmv_name);
1630	release_firmware(*fw);
1631	return -EILSEQ;
1632}
1633
1634static int request_cmvs(struct uea_softc *sc,
1635		 void **cmvs, const struct firmware **fw, int *ver)
1636{
1637	int ret, size;
1638	u32 crc;
1639	u8 *data;
1640	char cmv_name[UEA_FW_NAME_MAX]; /* 30 bytes stack variable */
1641
1642	cmvs_file_name(sc, cmv_name, 2);
1643	ret = request_firmware(fw, cmv_name, &sc->usb_dev->dev);
1644	if (ret < 0) {
1645		/* if caller can handle old version, try to provide it */
1646		if (*ver == 1) {
1647			uea_warn(INS_TO_USBDEV(sc), "requesting "
1648							"firmware %s failed, "
1649				"try to get older cmvs\n", cmv_name);
1650			return request_cmvs_old(sc, cmvs, fw);
1651		}
1652		uea_err(INS_TO_USBDEV(sc),
1653		       "requesting firmware %s failed with error %d\n",
1654		       cmv_name, ret);
1655		return ret;
1656	}
1657
1658	size = (*fw)->size;
1659	data = (u8 *) (*fw)->data;
1660	if (size < 4 || strncmp(data, "cmv2", 4) != 0) {
1661		if (*ver == 1) {
1662			uea_warn(INS_TO_USBDEV(sc), "firmware %s is corrupted,"
1663				" try to get older cmvs\n", cmv_name);
1664			release_firmware(*fw);
1665			return request_cmvs_old(sc, cmvs, fw);
1666		}
1667		goto err_fw_corrupted;
1668	}
1669
1670	*ver = 2;
1671
1672	data += 4;
1673	size -= 4;
1674	if (size < 5)
1675		goto err_fw_corrupted;
1676
1677	crc = get_unaligned_le32(data);
1678	data += 4;
1679	size -= 4;
1680	if (crc32_be(0, data, size) != crc)
1681		goto err_fw_corrupted;
1682
1683	if (size != *data * sizeof(struct uea_cmvs_v2) + 1)
1684		goto err_fw_corrupted;
1685
1686	*cmvs = (void *) (data + 1);
1687	return *data;
1688
1689err_fw_corrupted:
1690	uea_err(INS_TO_USBDEV(sc), "firmware %s is corrupted\n", cmv_name);
1691	release_firmware(*fw);
1692	return -EILSEQ;
1693}
1694
1695static int uea_send_cmvs_e1(struct uea_softc *sc)
1696{
1697	int i, ret, len;
1698	void *cmvs_ptr;
1699	const struct firmware *cmvs_fw;
1700	int ver = 1; /* we can handle v1 cmv firmware version; */
1701
1702	/* Enter in R-IDLE (cmv) until instructed otherwise */
1703	ret = uea_write_cmv_e1(sc, E1_SA_CNTL, 0, 1);
1704	if (ret < 0)
1705		return ret;
1706
1707	/* Dump firmware version */
1708	ret = uea_read_cmv_e1(sc, E1_SA_INFO, 10, &sc->stats.phy.firmid);
1709	if (ret < 0)
1710		return ret;
1711	uea_info(INS_TO_USBDEV(sc), "ATU-R firmware version : %x\n",
1712			sc->stats.phy.firmid);
1713
1714	/* get options */
1715	ret = len = request_cmvs(sc, &cmvs_ptr, &cmvs_fw, &ver);
1716	if (ret < 0)
1717		return ret;
1718
1719	/* send options */
1720	if (ver == 1) {
1721		struct uea_cmvs_v1 *cmvs_v1 = cmvs_ptr;
1722
1723		uea_warn(INS_TO_USBDEV(sc), "use deprecated cmvs version, "
1724			"please update your firmware\n");
1725
1726		for (i = 0; i < len; i++) {
1727			ret = uea_write_cmv_e1(sc,
1728				get_unaligned_le32(&cmvs_v1[i].address),
1729				get_unaligned_le16(&cmvs_v1[i].offset),
1730				get_unaligned_le32(&cmvs_v1[i].data));
1731			if (ret < 0)
1732				goto out;
1733		}
1734	} else if (ver == 2) {
1735		struct uea_cmvs_v2 *cmvs_v2 = cmvs_ptr;
1736
1737		for (i = 0; i < len; i++) {
1738			ret = uea_write_cmv_e1(sc,
1739				get_unaligned_le32(&cmvs_v2[i].address),
1740				(u16) get_unaligned_le32(&cmvs_v2[i].offset),
1741				get_unaligned_le32(&cmvs_v2[i].data));
1742			if (ret < 0)
1743				goto out;
1744		}
1745	} else {
1746		/* This realy should not happen */
1747		uea_err(INS_TO_USBDEV(sc), "bad cmvs version %d\n", ver);
1748		goto out;
1749	}
1750
1751	/* Enter in R-ACT-REQ */
1752	ret = uea_write_cmv_e1(sc, E1_SA_CNTL, 0, 2);
1753	uea_vdbg(INS_TO_USBDEV(sc), "Entering in R-ACT-REQ state\n");
1754	uea_info(INS_TO_USBDEV(sc), "modem started, waiting "
1755						"synchronization...\n");
1756out:
1757	release_firmware(cmvs_fw);
1758	return ret;
1759}
1760
1761static int uea_send_cmvs_e4(struct uea_softc *sc)
1762{
1763	int i, ret, len;
1764	void *cmvs_ptr;
1765	const struct firmware *cmvs_fw;
1766	int ver = 2; /* we can only handle v2 cmv firmware version; */
1767
1768	/* Enter in R-IDLE (cmv) until instructed otherwise */
1769	ret = uea_write_cmv_e4(sc, 1, E4_SA_CNTL, 0, 0, 1);
1770	if (ret < 0)
1771		return ret;
1772
1773	/* Dump firmware version */
1774	ret = uea_read_cmv_e4(sc, 2, E4_SA_INFO, 55, 0, &sc->stats.phy.firmid);
1775	if (ret < 0)
1776		return ret;
1777	uea_info(INS_TO_USBDEV(sc), "ATU-R firmware version : %x\n",
1778			sc->stats.phy.firmid);
1779
1780
1781	/* get options */
1782	ret = len = request_cmvs(sc, &cmvs_ptr, &cmvs_fw, &ver);
1783	if (ret < 0)
1784		return ret;
1785
1786	/* send options */
1787	if (ver == 2) {
1788		struct uea_cmvs_v2 *cmvs_v2 = cmvs_ptr;
1789
1790		for (i = 0; i < len; i++) {
1791			ret = uea_write_cmv_e4(sc, 1,
1792				get_unaligned_le32(&cmvs_v2[i].group),
1793				get_unaligned_le32(&cmvs_v2[i].address),
1794				get_unaligned_le32(&cmvs_v2[i].offset),
1795				get_unaligned_le32(&cmvs_v2[i].data));
1796			if (ret < 0)
1797				goto out;
1798		}
1799	} else {
1800		/* This realy should not happen */
1801		uea_err(INS_TO_USBDEV(sc), "bad cmvs version %d\n", ver);
1802		goto out;
1803	}
1804
1805	/* Enter in R-ACT-REQ */
1806	ret = uea_write_cmv_e4(sc, 1, E4_SA_CNTL, 0, 0, 2);
1807	uea_vdbg(INS_TO_USBDEV(sc), "Entering in R-ACT-REQ state\n");
1808	uea_info(INS_TO_USBDEV(sc), "modem started, waiting "
1809						"synchronization...\n");
1810out:
1811	release_firmware(cmvs_fw);
1812	return ret;
1813}
1814
1815/* Start boot post firmware modem:
1816 * - send reset commands through usb control pipe
1817 * - start workqueue for DSP loading
1818 * - send CMV options to modem
1819 */
1820
1821static int uea_start_reset(struct uea_softc *sc)
1822{
1823	u16 zero = 0;	/* ;-) */
1824	int ret;
1825
1826	uea_enters(INS_TO_USBDEV(sc));
1827	uea_info(INS_TO_USBDEV(sc), "(re)booting started\n");
1828
1829	/* mask interrupt */
1830	sc->booting = 1;
1831	/* We need to set this here because, a ack timeout could have occured,
1832	 * but before we start the reboot, the ack occurs and set this to 1.
1833	 * So we will failed to wait Ready CMV.
1834	 */
1835	sc->cmv_ack = 0;
1836	UPDATE_ATM_SIGNAL(ATM_PHY_SIG_LOST);
1837
1838	/* reset statistics */
1839	memset(&sc->stats, 0, sizeof(struct uea_stats));
1840
1841	/* tell the modem that we want to boot in IDMA mode */
1842	uea_request(sc, UEA_SET_MODE, UEA_LOOPBACK_ON, 0, NULL);
1843	uea_request(sc, UEA_SET_MODE, UEA_BOOT_IDMA, 0, NULL);
1844
1845	/* enter reset mode */
1846	uea_request(sc, UEA_SET_MODE, UEA_START_RESET, 0, NULL);
1847
1848	/* original driver use 200ms, but windows driver use 100ms */
1849	ret = uea_wait(sc, 0, msecs_to_jiffies(100));
1850	if (ret < 0)
1851		return ret;
1852
1853	/* leave reset mode */
1854	uea_request(sc, UEA_SET_MODE, UEA_END_RESET, 0, NULL);
1855
1856	if (UEA_CHIP_VERSION(sc) != EAGLE_IV) {
1857		/* clear tx and rx mailboxes */
1858		uea_request(sc, UEA_SET_2183_DATA, UEA_MPTX_MAILBOX, 2, &zero);
1859		uea_request(sc, UEA_SET_2183_DATA, UEA_MPRX_MAILBOX, 2, &zero);
1860		uea_request(sc, UEA_SET_2183_DATA, UEA_SWAP_MAILBOX, 2, &zero);
1861	}
1862
1863	ret = uea_wait(sc, 0, msecs_to_jiffies(1000));
1864	if (ret < 0)
1865		return ret;
1866
1867	if (UEA_CHIP_VERSION(sc) == EAGLE_IV)
1868		sc->cmv_dsc.e4.function = E4_MAKEFUNCTION(E4_ADSLDIRECTIVE,
1869							E4_MODEMREADY, 1);
1870	else
1871		sc->cmv_dsc.e1.function = E1_MAKEFUNCTION(E1_ADSLDIRECTIVE,
1872							E1_MODEMREADY);
1873
1874	/* demask interrupt */
1875	sc->booting = 0;
1876
1877	/* start loading DSP */
1878	sc->pageno = 0;
1879	sc->ovl = 0;
1880	queue_work(sc->work_q, &sc->task);
1881
1882	/* wait for modem ready CMV */
1883	ret = wait_cmv_ack(sc);
1884	if (ret < 0)
1885		return ret;
1886
1887	uea_vdbg(INS_TO_USBDEV(sc), "Ready CMV received\n");
1888
1889	ret = sc->send_cmvs(sc);
1890	if (ret < 0)
1891		return ret;
1892
1893	sc->reset = 0;
1894	uea_leaves(INS_TO_USBDEV(sc));
1895	return ret;
1896}
1897
1898/*
1899 * In case of an error wait 1s before rebooting the modem
1900 * if the modem don't request reboot (-EAGAIN).
1901 * Monitor the modem every 1s.
1902 */
1903
1904static int uea_kthread(void *data)
1905{
1906	struct uea_softc *sc = data;
1907	int ret = -EAGAIN;
1908
1909	set_freezable();
1910	uea_enters(INS_TO_USBDEV(sc));
1911	while (!kthread_should_stop()) {
1912		if (ret < 0 || sc->reset)
1913			ret = uea_start_reset(sc);
1914		if (!ret)
1915			ret = sc->stat(sc);
1916		if (ret != -EAGAIN)
1917			uea_wait(sc, 0, msecs_to_jiffies(1000));
1918		try_to_freeze();
1919	}
1920	uea_leaves(INS_TO_USBDEV(sc));
1921	return ret;
1922}
1923
1924/* Load second usb firmware for ADI930 chip */
1925static int load_XILINX_firmware(struct uea_softc *sc)
1926{
1927	const struct firmware *fw_entry;
1928	int ret, size, u, ln;
1929	const u8 *pfw;
1930	u8 value;
1931	char *fw_name = FW_DIR "930-fpga.bin";
1932
1933	uea_enters(INS_TO_USBDEV(sc));
1934
1935	ret = request_firmware(&fw_entry, fw_name, &sc->usb_dev->dev);
1936	if (ret) {
1937		uea_err(INS_TO_USBDEV(sc), "firmware %s is not available\n",
1938		       fw_name);
1939		goto err0;
1940	}
1941
1942	pfw = fw_entry->data;
1943	size = fw_entry->size;
1944	if (size != 0x577B) {
1945		uea_err(INS_TO_USBDEV(sc), "firmware %s is corrupted\n",
1946		       fw_name);
1947		ret = -EILSEQ;
1948		goto err1;
1949	}
1950	for (u = 0; u < size; u += ln) {
1951		ln = min(size - u, 64);
1952		ret = uea_request(sc, 0xe, 0, ln, pfw + u);
1953		if (ret < 0) {
1954			uea_err(INS_TO_USBDEV(sc),
1955			       "elsa download data failed (%d)\n", ret);
1956			goto err1;
1957		}
1958	}
1959
1960	/* finish to send the fpga */
1961	ret = uea_request(sc, 0xe, 1, 0, NULL);
1962	if (ret < 0) {
1963		uea_err(INS_TO_USBDEV(sc),
1964				"elsa download data failed (%d)\n", ret);
1965		goto err1;
1966	}
1967
1968	/* Tell the modem we finish : de-assert reset */
1969	value = 0;
1970	ret = uea_send_modem_cmd(sc->usb_dev, 0xe, 1, &value);
1971	if (ret < 0)
1972		uea_err(sc->usb_dev, "elsa de-assert failed with error"
1973								" %d\n", ret);
1974
1975err1:
1976	release_firmware(fw_entry);
1977err0:
1978	uea_leaves(INS_TO_USBDEV(sc));
1979	return ret;
1980}
1981
1982/* The modem send us an ack. First with check if it right */
1983static void uea_dispatch_cmv_e1(struct uea_softc *sc, struct intr_pkt *intr)
1984{
1985	struct cmv_dsc_e1 *dsc = &sc->cmv_dsc.e1;
1986	struct cmv_e1 *cmv = &intr->u.e1.s2.cmv;
1987
1988	uea_enters(INS_TO_USBDEV(sc));
1989	if (le16_to_cpu(cmv->wPreamble) != E1_PREAMBLE)
1990		goto bad1;
1991
1992	if (cmv->bDirection != E1_MODEMTOHOST)
1993		goto bad1;
1994
1995	if (cmv->bFunction != dsc->function) {
1996		if (UEA_CHIP_VERSION(sc) == ADI930
1997				&& cmv->bFunction ==  E1_MAKEFUNCTION(2, 2)) {
1998			cmv->wIndex = cpu_to_le16(dsc->idx);
1999			put_unaligned_le32(dsc->address,
2000						&cmv->dwSymbolicAddress);
2001			cmv->wOffsetAddress = cpu_to_le16(dsc->offset);
2002		} else
2003			goto bad2;
2004	}
2005
2006	if (cmv->bFunction == E1_MAKEFUNCTION(E1_ADSLDIRECTIVE,
2007							E1_MODEMREADY)) {
2008		wake_up_cmv_ack(sc);
2009		uea_leaves(INS_TO_USBDEV(sc));
2010		return;
2011	}
2012
2013	/* in case of MEMACCESS */
2014	if (le16_to_cpu(cmv->wIndex) != dsc->idx ||
2015	    get_unaligned_le32(&cmv->dwSymbolicAddress) != dsc->address ||
2016	    le16_to_cpu(cmv->wOffsetAddress) != dsc->offset)
2017		goto bad2;
2018
2019	sc->data = get_unaligned_le32(&cmv->dwData);
2020	sc->data = sc->data << 16 | sc->data >> 16;
2021
2022	wake_up_cmv_ack(sc);
2023	uea_leaves(INS_TO_USBDEV(sc));
2024	return;
2025
2026bad2:
2027	uea_err(INS_TO_USBDEV(sc), "unexpected cmv received, "
2028			"Function : %d, Subfunction : %d\n",
2029			E1_FUNCTION_TYPE(cmv->bFunction),
2030			E1_FUNCTION_SUBTYPE(cmv->bFunction));
2031	uea_leaves(INS_TO_USBDEV(sc));
2032	return;
2033
2034bad1:
2035	uea_err(INS_TO_USBDEV(sc), "invalid cmv received, "
2036			"wPreamble %d, bDirection %d\n",
2037			le16_to_cpu(cmv->wPreamble), cmv->bDirection);
2038	uea_leaves(INS_TO_USBDEV(sc));
2039}
2040
2041/* The modem send us an ack. First with check if it right */
2042static void uea_dispatch_cmv_e4(struct uea_softc *sc, struct intr_pkt *intr)
2043{
2044	struct cmv_dsc_e4 *dsc = &sc->cmv_dsc.e4;
2045	struct cmv_e4 *cmv = &intr->u.e4.s2.cmv;
2046
2047	uea_enters(INS_TO_USBDEV(sc));
2048	uea_dbg(INS_TO_USBDEV(sc), "cmv %x %x %x %x %x %x\n",
2049		be16_to_cpu(cmv->wGroup), be16_to_cpu(cmv->wFunction),
2050		be16_to_cpu(cmv->wOffset), be16_to_cpu(cmv->wAddress),
2051		be32_to_cpu(cmv->dwData[0]), be32_to_cpu(cmv->dwData[1]));
2052
2053	if (be16_to_cpu(cmv->wFunction) != dsc->function)
2054		goto bad2;
2055
2056	if (be16_to_cpu(cmv->wFunction) == E4_MAKEFUNCTION(E4_ADSLDIRECTIVE,
2057						E4_MODEMREADY, 1)) {
2058		wake_up_cmv_ack(sc);
2059		uea_leaves(INS_TO_USBDEV(sc));
2060		return;
2061	}
2062
2063	/* in case of MEMACCESS */
2064	if (be16_to_cpu(cmv->wOffset) != dsc->offset ||
2065	    be16_to_cpu(cmv->wGroup) != dsc->group ||
2066	    be16_to_cpu(cmv->wAddress) != dsc->address)
2067		goto bad2;
2068
2069	sc->data = be32_to_cpu(cmv->dwData[0]);
2070	sc->data1 = be32_to_cpu(cmv->dwData[1]);
2071	wake_up_cmv_ack(sc);
2072	uea_leaves(INS_TO_USBDEV(sc));
2073	return;
2074
2075bad2:
2076	uea_err(INS_TO_USBDEV(sc), "unexpected cmv received, "
2077			"Function : %d, Subfunction : %d\n",
2078			E4_FUNCTION_TYPE(cmv->wFunction),
2079			E4_FUNCTION_SUBTYPE(cmv->wFunction));
2080	uea_leaves(INS_TO_USBDEV(sc));
2081	return;
2082}
2083
2084static void uea_schedule_load_page_e1(struct uea_softc *sc,
2085						struct intr_pkt *intr)
2086{
2087	sc->pageno = intr->e1_bSwapPageNo;
2088	sc->ovl = intr->e1_bOvl >> 4 | intr->e1_bOvl << 4;
2089	queue_work(sc->work_q, &sc->task);
2090}
2091
2092static void uea_schedule_load_page_e4(struct uea_softc *sc,
2093						struct intr_pkt *intr)
2094{
2095	sc->pageno = intr->e4_bSwapPageNo;
2096	queue_work(sc->work_q, &sc->task);
2097}
2098
2099/*
2100 * interrupt handler
2101 */
2102static void uea_intr(struct urb *urb)
2103{
2104	struct uea_softc *sc = urb->context;
2105	struct intr_pkt *intr = urb->transfer_buffer;
2106	int status = urb->status;
2107
2108	uea_enters(INS_TO_USBDEV(sc));
2109
2110	if (unlikely(status < 0)) {
2111		uea_err(INS_TO_USBDEV(sc), "uea_intr() failed with %d\n",
2112		       status);
2113		return;
2114	}
2115
2116	/* device-to-host interrupt */
2117	if (intr->bType != 0x08 || sc->booting) {
2118		uea_err(INS_TO_USBDEV(sc), "wrong interrupt\n");
2119		goto resubmit;
2120	}
2121
2122	switch (le16_to_cpu(intr->wInterrupt)) {
2123	case INT_LOADSWAPPAGE:
2124		sc->schedule_load_page(sc, intr);
2125		break;
2126
2127	case INT_INCOMINGCMV:
2128		sc->dispatch_cmv(sc, intr);
2129		break;
2130
2131	default:
2132		uea_err(INS_TO_USBDEV(sc), "unknown interrupt %u\n",
2133		       le16_to_cpu(intr->wInterrupt));
2134	}
2135
2136resubmit:
2137	usb_submit_urb(sc->urb_int, GFP_ATOMIC);
2138}
2139
2140/*
2141 * Start the modem : init the data and start kernel thread
2142 */
2143static int uea_boot(struct uea_softc *sc)
2144{
2145	int ret, size;
2146	struct intr_pkt *intr;
2147
2148	uea_enters(INS_TO_USBDEV(sc));
2149
2150	if (UEA_CHIP_VERSION(sc) == EAGLE_IV) {
2151		size = E4_INTR_PKT_SIZE;
2152		sc->dispatch_cmv = uea_dispatch_cmv_e4;
2153		sc->schedule_load_page = uea_schedule_load_page_e4;
2154		sc->stat = uea_stat_e4;
2155		sc->send_cmvs = uea_send_cmvs_e4;
2156		INIT_WORK(&sc->task, uea_load_page_e4);
2157	} else {
2158		size = E1_INTR_PKT_SIZE;
2159		sc->dispatch_cmv = uea_dispatch_cmv_e1;
2160		sc->schedule_load_page = uea_schedule_load_page_e1;
2161		sc->stat = uea_stat_e1;
2162		sc->send_cmvs = uea_send_cmvs_e1;
2163		INIT_WORK(&sc->task, uea_load_page_e1);
2164	}
2165
2166	init_waitqueue_head(&sc->sync_q);
2167
2168	sc->work_q = create_workqueue("ueagle-dsp");
2169	if (!sc->work_q) {
2170		uea_err(INS_TO_USBDEV(sc), "cannot allocate workqueue\n");
2171		uea_leaves(INS_TO_USBDEV(sc));
2172		return -ENOMEM;
2173	}
2174
2175	if (UEA_CHIP_VERSION(sc) == ADI930)
2176		load_XILINX_firmware(sc);
2177
2178	intr = kmalloc(size, GFP_KERNEL);
2179	if (!intr) {
2180		uea_err(INS_TO_USBDEV(sc),
2181		       "cannot allocate interrupt package\n");
2182		goto err0;
2183	}
2184
2185	sc->urb_int = usb_alloc_urb(0, GFP_KERNEL);
2186	if (!sc->urb_int) {
2187		uea_err(INS_TO_USBDEV(sc), "cannot allocate interrupt URB\n");
2188		goto err1;
2189	}
2190
2191	usb_fill_int_urb(sc->urb_int, sc->usb_dev,
2192			 usb_rcvintpipe(sc->usb_dev, UEA_INTR_PIPE),
2193			 intr, size, uea_intr, sc,
2194			 sc->usb_dev->actconfig->interface[0]->altsetting[0].
2195			 endpoint[0].desc.bInterval);
2196
2197	ret = usb_submit_urb(sc->urb_int, GFP_KERNEL);
2198	if (ret < 0) {
2199		uea_err(INS_TO_USBDEV(sc),
2200		       "urb submition failed with error %d\n", ret);
2201		goto err1;
2202	}
2203
2204	sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm");
2205	if (sc->kthread == ERR_PTR(-ENOMEM)) {
2206		uea_err(INS_TO_USBDEV(sc), "failed to create thread\n");
2207		goto err2;
2208	}
2209
2210	uea_leaves(INS_TO_USBDEV(sc));
2211	return 0;
2212
2213err2:
2214	usb_kill_urb(sc->urb_int);
2215err1:
2216	usb_free_urb(sc->urb_int);
2217	sc->urb_int = NULL;
2218	kfree(intr);
2219err0:
2220	destroy_workqueue(sc->work_q);
2221	uea_leaves(INS_TO_USBDEV(sc));
2222	return -ENOMEM;
2223}
2224
2225/*
2226 * Stop the modem : kill kernel thread and free data
2227 */
2228static void uea_stop(struct uea_softc *sc)
2229{
2230	int ret;
2231	uea_enters(INS_TO_USBDEV(sc));
2232	ret = kthread_stop(sc->kthread);
2233	uea_dbg(INS_TO_USBDEV(sc), "kthread finish with status %d\n", ret);
2234
2235	uea_request(sc, UEA_SET_MODE, UEA_LOOPBACK_ON, 0, NULL);
2236
2237	usb_kill_urb(sc->urb_int);
2238	kfree(sc->urb_int->transfer_buffer);
2239	usb_free_urb(sc->urb_int);
2240
2241	/* stop any pending boot process, when no one can schedule work */
2242	destroy_workqueue(sc->work_q);
2243
2244	if (sc->dsp_firm)
2245		release_firmware(sc->dsp_firm);
2246	uea_leaves(INS_TO_USBDEV(sc));
2247}
2248
2249/* syfs interface */
2250static struct uea_softc *dev_to_uea(struct device *dev)
2251{
2252	struct usb_interface *intf;
2253	struct usbatm_data *usbatm;
2254
2255	intf = to_usb_interface(dev);
2256	if (!intf)
2257		return NULL;
2258
2259	usbatm = usb_get_intfdata(intf);
2260	if (!usbatm)
2261		return NULL;
2262
2263	return usbatm->driver_data;
2264}
2265
2266static ssize_t read_status(struct device *dev, struct device_attribute *attr,
2267		char *buf)
2268{
2269	int ret = -ENODEV;
2270	struct uea_softc *sc;
2271
2272	mutex_lock(&uea_mutex);
2273	sc = dev_to_uea(dev);
2274	if (!sc)
2275		goto out;
2276	ret = snprintf(buf, 10, "%08x\n", sc->stats.phy.state);
2277out:
2278	mutex_unlock(&uea_mutex);
2279	return ret;
2280}
2281
2282static ssize_t reboot(struct device *dev, struct device_attribute *attr,
2283		const char *buf, size_t count)
2284{
2285	int ret = -ENODEV;
2286	struct uea_softc *sc;
2287
2288	mutex_lock(&uea_mutex);
2289	sc = dev_to_uea(dev);
2290	if (!sc)
2291		goto out;
2292	sc->reset = 1;
2293	ret = count;
2294out:
2295	mutex_unlock(&uea_mutex);
2296	return ret;
2297}
2298
2299static DEVICE_ATTR(stat_status, S_IWUSR | S_IRUGO, read_status, reboot);
2300
2301static ssize_t read_human_status(struct device *dev,
2302			struct device_attribute *attr, char *buf)
2303{
2304	int ret = -ENODEV;
2305	int modem_state;
2306	struct uea_softc *sc;
2307
2308	mutex_lock(&uea_mutex);
2309	sc = dev_to_uea(dev);
2310	if (!sc)
2311		goto out;
2312
2313	if (UEA_CHIP_VERSION(sc) == EAGLE_IV) {
2314		switch (sc->stats.phy.state) {
2315		case 0x0:	/* not yet synchronized */
2316		case 0x1:
2317		case 0x3:
2318		case 0x4:
2319			modem_state = 0;
2320			break;
2321		case 0x5:	/* initialization */
2322		case 0x6:
2323		case 0x9:
2324		case 0xa:
2325			modem_state = 1;
2326			break;
2327		case 0x7:	/* operational */
2328			modem_state = 2;
2329			break;
2330		case 0x2:	/* fail ... */
2331			modem_state = 3;
2332			break;
2333		default:	/* unknown */
2334			modem_state = 4;
2335			break;
2336		}
2337	} else
2338		modem_state = GET_STATUS(sc->stats.phy.state);
2339
2340	switch (modem_state) {
2341	case 0:
2342		ret = sprintf(buf, "Modem is booting\n");
2343		break;
2344	case 1:
2345		ret = sprintf(buf, "Modem is initializing\n");
2346		break;
2347	case 2:
2348		ret = sprintf(buf, "Modem is operational\n");
2349		break;
2350	case 3:
2351		ret = sprintf(buf, "Modem synchronization failed\n");
2352		break;
2353	default:
2354		ret = sprintf(buf, "Modem state is unknown\n");
2355		break;
2356	}
2357out:
2358	mutex_unlock(&uea_mutex);
2359	return ret;
2360}
2361
2362static DEVICE_ATTR(stat_human_status, S_IRUGO, read_human_status, NULL);
2363
2364static ssize_t read_delin(struct device *dev, struct device_attribute *attr,
2365		char *buf)
2366{
2367	int ret = -ENODEV;
2368	struct uea_softc *sc;
2369	char *delin = "GOOD";
2370
2371	mutex_lock(&uea_mutex);
2372	sc = dev_to_uea(dev);
2373	if (!sc)
2374		goto out;
2375
2376	if (UEA_CHIP_VERSION(sc) == EAGLE_IV) {
2377		if (sc->stats.phy.flags & 0x4000)
2378			delin = "RESET";
2379		else if (sc->stats.phy.flags & 0x0001)
2380			delin = "LOSS";
2381	} else {
2382		if (sc->stats.phy.flags & 0x0C00)
2383			delin = "ERROR";
2384		else if (sc->stats.phy.flags & 0x0030)
2385			delin = "LOSS";
2386	}
2387
2388	ret = sprintf(buf, "%s\n", delin);
2389out:
2390	mutex_unlock(&uea_mutex);
2391	return ret;
2392}
2393
2394static DEVICE_ATTR(stat_delin, S_IRUGO, read_delin, NULL);
2395
2396#define UEA_ATTR(name, reset)					\
2397								\
2398static ssize_t read_##name(struct device *dev,			\
2399		struct device_attribute *attr, char *buf)	\
2400{								\
2401	int ret = -ENODEV;					\
2402	struct uea_softc *sc;					\
2403								\
2404	mutex_lock(&uea_mutex);					\
2405	sc = dev_to_uea(dev);					\
2406	if (!sc)						\
2407		goto out;					\
2408	ret = snprintf(buf, 10, "%08x\n", sc->stats.phy.name);	\
2409	if (reset)						\
2410		sc->stats.phy.name = 0;				\
2411out:								\
2412	mutex_unlock(&uea_mutex);				\
2413	return ret;						\
2414}								\
2415								\
2416static DEVICE_ATTR(stat_##name, S_IRUGO, read_##name, NULL)
2417
2418UEA_ATTR(mflags, 1);
2419UEA_ATTR(vidcpe, 0);
2420UEA_ATTR(usrate, 0);
2421UEA_ATTR(dsrate, 0);
2422UEA_ATTR(usattenuation, 0);
2423UEA_ATTR(dsattenuation, 0);
2424UEA_ATTR(usmargin, 0);
2425UEA_ATTR(dsmargin, 0);
2426UEA_ATTR(txflow, 0);
2427UEA_ATTR(rxflow, 0);
2428UEA_ATTR(uscorr, 0);
2429UEA_ATTR(dscorr, 0);
2430UEA_ATTR(usunc, 0);
2431UEA_ATTR(dsunc, 0);
2432UEA_ATTR(firmid, 0);
2433
2434/* Retrieve the device End System Identifier (MAC) */
2435
2436static int uea_getesi(struct uea_softc *sc, u_char * esi)
2437{
2438	unsigned char mac_str[2 * ETH_ALEN + 1];
2439	int i;
2440	if (usb_string
2441	    (sc->usb_dev, sc->usb_dev->descriptor.iSerialNumber, mac_str,
2442	     sizeof(mac_str)) != 2 * ETH_ALEN)
2443		return 1;
2444
2445	for (i = 0; i < ETH_ALEN; i++)
2446		esi[i] = hex_to_bin(mac_str[2 * i]) * 16 +
2447			 hex_to_bin(mac_str[2 * i + 1]);
2448
2449	return 0;
2450}
2451
2452/* ATM stuff */
2453static int uea_atm_open(struct usbatm_data *usbatm, struct atm_dev *atm_dev)
2454{
2455	struct uea_softc *sc = usbatm->driver_data;
2456
2457	return uea_getesi(sc, atm_dev->esi);
2458}
2459
2460static int uea_heavy(struct usbatm_data *usbatm, struct usb_interface *intf)
2461{
2462	struct uea_softc *sc = usbatm->driver_data;
2463
2464	wait_event_interruptible(sc->sync_q, IS_OPERATIONAL(sc));
2465
2466	return 0;
2467
2468}
2469
2470static int claim_interface(struct usb_device *usb_dev,
2471			   struct usbatm_data *usbatm, int ifnum)
2472{
2473	int ret;
2474	struct usb_interface *intf = usb_ifnum_to_if(usb_dev, ifnum);
2475
2476	if (!intf) {
2477		uea_err(usb_dev, "interface %d not found\n", ifnum);
2478		return -ENODEV;
2479	}
2480
2481	ret = usb_driver_claim_interface(&uea_driver, intf, usbatm);
2482	if (ret != 0)
2483		uea_err(usb_dev, "can't claim interface %d, error %d\n", ifnum,
2484		       ret);
2485	return ret;
2486}
2487
2488static struct attribute *attrs[] = {
2489	&dev_attr_stat_status.attr,
2490	&dev_attr_stat_mflags.attr,
2491	&dev_attr_stat_human_status.attr,
2492	&dev_attr_stat_delin.attr,
2493	&dev_attr_stat_vidcpe.attr,
2494	&dev_attr_stat_usrate.attr,
2495	&dev_attr_stat_dsrate.attr,
2496	&dev_attr_stat_usattenuation.attr,
2497	&dev_attr_stat_dsattenuation.attr,
2498	&dev_attr_stat_usmargin.attr,
2499	&dev_attr_stat_dsmargin.attr,
2500	&dev_attr_stat_txflow.attr,
2501	&dev_attr_stat_rxflow.attr,
2502	&dev_attr_stat_uscorr.attr,
2503	&dev_attr_stat_dscorr.attr,
2504	&dev_attr_stat_usunc.attr,
2505	&dev_attr_stat_dsunc.attr,
2506	&dev_attr_stat_firmid.attr,
2507	NULL,
2508};
2509static struct attribute_group attr_grp = {
2510	.attrs = attrs,
2511};
2512
2513static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf,
2514		   const struct usb_device_id *id)
2515{
2516	struct usb_device *usb = interface_to_usbdev(intf);
2517	struct uea_softc *sc;
2518	int ret, ifnum = intf->altsetting->desc.bInterfaceNumber;
2519	unsigned int alt;
2520
2521	uea_enters(usb);
2522
2523	/* interface 0 is for firmware/monitoring */
2524	if (ifnum != UEA_INTR_IFACE_NO)
2525		return -ENODEV;
2526
2527	usbatm->flags = (sync_wait[modem_index] ? 0 : UDSL_SKIP_HEAVY_INIT);
2528
2529	/* interface 1 is for outbound traffic */
2530	ret = claim_interface(usb, usbatm, UEA_US_IFACE_NO);
2531	if (ret < 0)
2532		return ret;
2533
2534	/* ADI930 has only 2 interfaces and inbound traffic is on interface 1 */
2535	if (UEA_CHIP_VERSION(id) != ADI930) {
2536		/* interface 2 is for inbound traffic */
2537		ret = claim_interface(usb, usbatm, UEA_DS_IFACE_NO);
2538		if (ret < 0)
2539			return ret;
2540	}
2541
2542	sc = kzalloc(sizeof(struct uea_softc), GFP_KERNEL);
2543	if (!sc) {
2544		uea_err(usb, "uea_init: not enough memory !\n");
2545		return -ENOMEM;
2546	}
2547
2548	sc->usb_dev = usb;
2549	usbatm->driver_data = sc;
2550	sc->usbatm = usbatm;
2551	sc->modem_index = (modem_index < NB_MODEM) ? modem_index++ : 0;
2552	sc->driver_info = id->driver_info;
2553
2554	/* first try to use module parameter */
2555	if (annex[sc->modem_index] == 1)
2556		sc->annex = ANNEXA;
2557	else if (annex[sc->modem_index] == 2)
2558		sc->annex = ANNEXB;
2559	/* try to autodetect annex */
2560	else if (sc->driver_info & AUTO_ANNEX_A)
2561		sc->annex = ANNEXA;
2562	else if (sc->driver_info & AUTO_ANNEX_B)
2563		sc->annex = ANNEXB;
2564	else
2565		sc->annex = (le16_to_cpu
2566		(sc->usb_dev->descriptor.bcdDevice) & 0x80) ? ANNEXB : ANNEXA;
2567
2568	alt = altsetting[sc->modem_index];
2569	/* ADI930 don't support iso */
2570	if (UEA_CHIP_VERSION(id) != ADI930 && alt > 0) {
2571		if (alt <= 8 &&
2572			usb_set_interface(usb, UEA_DS_IFACE_NO, alt) == 0) {
2573			uea_dbg(usb, "set alternate %u for 2 interface\n", alt);
2574			uea_info(usb, "using iso mode\n");
2575			usbatm->flags |= UDSL_USE_ISOC | UDSL_IGNORE_EILSEQ;
2576		} else {
2577			uea_err(usb, "setting alternate %u failed for "
2578					"2 interface, using bulk mode\n", alt);
2579		}
2580	}
2581
2582	ret = sysfs_create_group(&intf->dev.kobj, &attr_grp);
2583	if (ret < 0)
2584		goto error;
2585
2586	ret = uea_boot(sc);
2587	if (ret < 0)
2588		goto error_rm_grp;
2589
2590	return 0;
2591
2592error_rm_grp:
2593	sysfs_remove_group(&intf->dev.kobj, &attr_grp);
2594error:
2595	kfree(sc);
2596	return ret;
2597}
2598
2599static void uea_unbind(struct usbatm_data *usbatm, struct usb_interface *intf)
2600{
2601	struct uea_softc *sc = usbatm->driver_data;
2602
2603	sysfs_remove_group(&intf->dev.kobj, &attr_grp);
2604	uea_stop(sc);
2605	kfree(sc);
2606}
2607
2608static struct usbatm_driver uea_usbatm_driver = {
2609	.driver_name = "ueagle-atm",
2610	.bind = uea_bind,
2611	.atm_start = uea_atm_open,
2612	.unbind = uea_unbind,
2613	.heavy_init = uea_heavy,
2614	.bulk_in = UEA_BULK_DATA_PIPE,
2615	.bulk_out = UEA_BULK_DATA_PIPE,
2616	.isoc_in = UEA_ISO_DATA_PIPE,
2617};
2618
2619static int uea_probe(struct usb_interface *intf, const struct usb_device_id *id)
2620{
2621	struct usb_device *usb = interface_to_usbdev(intf);
2622
2623	uea_enters(usb);
2624	uea_info(usb, "ADSL device founded vid (%#X) pid (%#X) Rev (%#X): %s\n",
2625		le16_to_cpu(usb->descriptor.idVendor),
2626		le16_to_cpu(usb->descriptor.idProduct),
2627		le16_to_cpu(usb->descriptor.bcdDevice),
2628		chip_name[UEA_CHIP_VERSION(id)]);
2629
2630	usb_reset_device(usb);
2631
2632	if (UEA_IS_PREFIRM(id))
2633		return uea_load_firmware(usb, UEA_CHIP_VERSION(id));
2634
2635	return usbatm_usb_probe(intf, id, &uea_usbatm_driver);
2636}
2637
2638static void uea_disconnect(struct usb_interface *intf)
2639{
2640	struct usb_device *usb = interface_to_usbdev(intf);
2641	int ifnum = intf->altsetting->desc.bInterfaceNumber;
2642	uea_enters(usb);
2643
2644	/* ADI930 has 2 interfaces and eagle 3 interfaces.
2645	 * Pre-firmware device has one interface
2646	 */
2647	if (usb->config->desc.bNumInterfaces != 1 && ifnum == 0) {
2648		mutex_lock(&uea_mutex);
2649		usbatm_usb_disconnect(intf);
2650		mutex_unlock(&uea_mutex);
2651		uea_info(usb, "ADSL device removed\n");
2652	}
2653
2654	uea_leaves(usb);
2655}
2656
2657/*
2658 * List of supported VID/PID
2659 */
2660static const struct usb_device_id uea_ids[] = {
2661	{USB_DEVICE(ANALOG_VID,	ADI930_PID_PREFIRM),
2662		.driver_info = ADI930 | PREFIRM},
2663	{USB_DEVICE(ANALOG_VID,	ADI930_PID_PSTFIRM),
2664		.driver_info = ADI930 | PSTFIRM},
2665	{USB_DEVICE(ANALOG_VID,	EAGLE_I_PID_PREFIRM),
2666		.driver_info = EAGLE_I | PREFIRM},
2667	{USB_DEVICE(ANALOG_VID,	EAGLE_I_PID_PSTFIRM),
2668		.driver_info = EAGLE_I | PSTFIRM},
2669	{USB_DEVICE(ANALOG_VID,	EAGLE_II_PID_PREFIRM),
2670		.driver_info = EAGLE_II | PREFIRM},
2671	{USB_DEVICE(ANALOG_VID,	EAGLE_II_PID_PSTFIRM),
2672		.driver_info = EAGLE_II | PSTFIRM},
2673	{USB_DEVICE(ANALOG_VID,	EAGLE_IIC_PID_PREFIRM),
2674		.driver_info = EAGLE_II | PREFIRM},
2675	{USB_DEVICE(ANALOG_VID,	EAGLE_IIC_PID_PSTFIRM),
2676		.driver_info = EAGLE_II | PSTFIRM},
2677	{USB_DEVICE(ANALOG_VID,	EAGLE_III_PID_PREFIRM),
2678		.driver_info = EAGLE_III | PREFIRM},
2679	{USB_DEVICE(ANALOG_VID,	EAGLE_III_PID_PSTFIRM),
2680		.driver_info = EAGLE_III | PSTFIRM},
2681	{USB_DEVICE(ANALOG_VID,	EAGLE_IV_PID_PREFIRM),
2682		.driver_info = EAGLE_IV | PREFIRM},
2683	{USB_DEVICE(ANALOG_VID,	EAGLE_IV_PID_PSTFIRM),
2684		.driver_info = EAGLE_IV | PSTFIRM},
2685	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_I_A_PID_PREFIRM),
2686		.driver_info = EAGLE_I | PREFIRM},
2687	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_I_A_PID_PSTFIRM),
2688		.driver_info = EAGLE_I | PSTFIRM | AUTO_ANNEX_A},
2689	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_I_B_PID_PREFIRM),
2690		.driver_info = EAGLE_I | PREFIRM},
2691	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_I_B_PID_PSTFIRM),
2692		.driver_info = EAGLE_I | PSTFIRM | AUTO_ANNEX_B},
2693	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_II_A_PID_PREFIRM),
2694		.driver_info = EAGLE_II | PREFIRM},
2695	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_II_A_PID_PSTFIRM),
2696		.driver_info = EAGLE_II | PSTFIRM | AUTO_ANNEX_A},
2697	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_II_B_PID_PREFIRM),
2698		.driver_info = EAGLE_II | PREFIRM},
2699	{USB_DEVICE(DEVOLO_VID,	DEVOLO_EAGLE_II_B_PID_PSTFIRM),
2700		.driver_info = EAGLE_II | PSTFIRM | AUTO_ANNEX_B},
2701	{USB_DEVICE(ELSA_VID,	ELSA_PID_PREFIRM),
2702		.driver_info = ADI930 | PREFIRM},
2703	{USB_DEVICE(ELSA_VID,	ELSA_PID_PSTFIRM),
2704		.driver_info = ADI930 | PSTFIRM},
2705	{USB_DEVICE(ELSA_VID,	ELSA_PID_A_PREFIRM),
2706		.driver_info = ADI930 | PREFIRM},
2707	{USB_DEVICE(ELSA_VID,	ELSA_PID_A_PSTFIRM),
2708		.driver_info = ADI930 | PSTFIRM | AUTO_ANNEX_A},
2709	{USB_DEVICE(ELSA_VID,	ELSA_PID_B_PREFIRM),
2710		.driver_info = ADI930 | PREFIRM},
2711	{USB_DEVICE(ELSA_VID,	ELSA_PID_B_PSTFIRM),
2712		.driver_info = ADI930 | PSTFIRM | AUTO_ANNEX_B},
2713	{USB_DEVICE(USR_VID,	MILLER_A_PID_PREFIRM),
2714		.driver_info = EAGLE_I | PREFIRM},
2715	{USB_DEVICE(USR_VID,	MILLER_A_PID_PSTFIRM),
2716		.driver_info = EAGLE_I | PSTFIRM  | AUTO_ANNEX_A},
2717	{USB_DEVICE(USR_VID,	MILLER_B_PID_PREFIRM),
2718		.driver_info = EAGLE_I | PREFIRM},
2719	{USB_DEVICE(USR_VID,	MILLER_B_PID_PSTFIRM),
2720		.driver_info = EAGLE_I | PSTFIRM  | AUTO_ANNEX_B},
2721	{USB_DEVICE(USR_VID,	HEINEKEN_A_PID_PREFIRM),
2722		.driver_info = EAGLE_I | PREFIRM},
2723	{USB_DEVICE(USR_VID,	HEINEKEN_A_PID_PSTFIRM),
2724		.driver_info = EAGLE_I | PSTFIRM | AUTO_ANNEX_A},
2725	{USB_DEVICE(USR_VID,	HEINEKEN_B_PID_PREFIRM),
2726		.driver_info = EAGLE_I | PREFIRM},
2727	{USB_DEVICE(USR_VID,	HEINEKEN_B_PID_PSTFIRM),
2728		.driver_info = EAGLE_I | PSTFIRM | AUTO_ANNEX_B},
2729	{}
2730};
2731
2732/*
2733 * USB driver descriptor
2734 */
2735static struct usb_driver uea_driver = {
2736	.name = "ueagle-atm",
2737	.id_table = uea_ids,
2738	.probe = uea_probe,
2739	.disconnect = uea_disconnect,
2740};
2741
2742MODULE_DEVICE_TABLE(usb, uea_ids);
2743
2744/**
2745 * uea_init - Initialize the module.
2746 *      Register to USB subsystem
2747 */
2748static int __init uea_init(void)
2749{
2750	printk(KERN_INFO "[ueagle-atm] driver " EAGLEUSBVERSION " loaded\n");
2751
2752	usb_register(&uea_driver);
2753
2754	return 0;
2755}
2756
2757module_init(uea_init);
2758
2759/**
2760 * uea_exit  -  Destroy module
2761 *    Deregister with USB subsystem
2762 */
2763static void __exit uea_exit(void)
2764{
2765	/*
2766	 * This calls automatically the uea_disconnect method if necessary:
2767	 */
2768	usb_deregister(&uea_driver);
2769
2770	printk(KERN_INFO "[ueagle-atm] driver unloaded\n");
2771}
2772
2773module_exit(uea_exit);
2774
2775MODULE_AUTHOR("Damien Bergamini/Matthieu Castet/Stanislaw W. Gruszka");
2776MODULE_DESCRIPTION("ADI 930/Eagle USB ADSL Modem driver");
2777MODULE_LICENSE("Dual BSD/GPL");
2778