Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
Коммит
7ecc59c1b7
|
@ -60,10 +60,9 @@ open() operation on regular files or character devices.
|
||||||
|
|
||||||
After a successful return from register_appl(), CAPI messages from the
|
After a successful return from register_appl(), CAPI messages from the
|
||||||
application may be passed to the driver for the device via calls to the
|
application may be passed to the driver for the device via calls to the
|
||||||
send_message() callback function. The CAPI message to send is stored in the
|
send_message() callback function. Conversely, the driver may call Kernel
|
||||||
data portion of an skb. Conversely, the driver may call Kernel CAPI's
|
CAPI's capi_ctr_handle_message() function to pass a received CAPI message to
|
||||||
capi_ctr_handle_message() function to pass a received CAPI message to Kernel
|
Kernel CAPI for forwarding to an application, specifying its ApplID.
|
||||||
CAPI for forwarding to an application, specifying its ApplID.
|
|
||||||
|
|
||||||
Deregistration requests (CAPI operation CAPI_RELEASE) from applications are
|
Deregistration requests (CAPI operation CAPI_RELEASE) from applications are
|
||||||
forwarded as calls to the release_appl() callback function, passing the same
|
forwarded as calls to the release_appl() callback function, passing the same
|
||||||
|
@ -142,6 +141,7 @@ u16 (*send_message)(struct capi_ctr *ctrlr, struct sk_buff *skb)
|
||||||
to accepting or queueing the message. Errors occurring during the
|
to accepting or queueing the message. Errors occurring during the
|
||||||
actual processing of the message should be signaled with an
|
actual processing of the message should be signaled with an
|
||||||
appropriate reply message.
|
appropriate reply message.
|
||||||
|
May be called in process or interrupt context.
|
||||||
Calls to this function are not serialized by Kernel CAPI, ie. it must
|
Calls to this function are not serialized by Kernel CAPI, ie. it must
|
||||||
be prepared to be re-entered.
|
be prepared to be re-entered.
|
||||||
|
|
||||||
|
@ -154,7 +154,8 @@ read_proc_t *ctr_read_proc
|
||||||
system entry, /proc/capi/controllers/<n>; will be called with a
|
system entry, /proc/capi/controllers/<n>; will be called with a
|
||||||
pointer to the device's capi_ctr structure as the last (data) argument
|
pointer to the device's capi_ctr structure as the last (data) argument
|
||||||
|
|
||||||
Note: Callback functions are never called in interrupt context.
|
Note: Callback functions except send_message() are never called in interrupt
|
||||||
|
context.
|
||||||
|
|
||||||
- to be filled in before calling capi_ctr_ready():
|
- to be filled in before calling capi_ctr_ready():
|
||||||
|
|
||||||
|
@ -171,14 +172,40 @@ u8 serial[CAPI_SERIAL_LEN]
|
||||||
value to return for CAPI_GET_SERIAL
|
value to return for CAPI_GET_SERIAL
|
||||||
|
|
||||||
|
|
||||||
4.3 The _cmsg Structure
|
4.3 SKBs
|
||||||
|
|
||||||
|
CAPI messages are passed between Kernel CAPI and the driver via send_message()
|
||||||
|
and capi_ctr_handle_message(), stored in the data portion of a socket buffer
|
||||||
|
(skb). Each skb contains a single CAPI message coded according to the CAPI 2.0
|
||||||
|
standard.
|
||||||
|
|
||||||
|
For the data transfer messages, DATA_B3_REQ and DATA_B3_IND, the actual
|
||||||
|
payload data immediately follows the CAPI message itself within the same skb.
|
||||||
|
The Data and Data64 parameters are not used for processing. The Data64
|
||||||
|
parameter may be omitted by setting the length field of the CAPI message to 22
|
||||||
|
instead of 30.
|
||||||
|
|
||||||
|
|
||||||
|
4.4 The _cmsg Structure
|
||||||
|
|
||||||
(declared in <linux/isdn/capiutil.h>)
|
(declared in <linux/isdn/capiutil.h>)
|
||||||
|
|
||||||
The _cmsg structure stores the contents of a CAPI 2.0 message in an easily
|
The _cmsg structure stores the contents of a CAPI 2.0 message in an easily
|
||||||
accessible form. It contains members for all possible CAPI 2.0 parameters, of
|
accessible form. It contains members for all possible CAPI 2.0 parameters,
|
||||||
which only those appearing in the message type currently being processed are
|
including subparameters of the Additional Info and B Protocol structured
|
||||||
actually used. Unused members should be set to zero.
|
parameters, with the following exceptions:
|
||||||
|
|
||||||
|
* second Calling party number (CONNECT_IND)
|
||||||
|
|
||||||
|
* Data64 (DATA_B3_REQ and DATA_B3_IND)
|
||||||
|
|
||||||
|
* Sending complete (subparameter of Additional Info, CONNECT_REQ and INFO_REQ)
|
||||||
|
|
||||||
|
* Global Configuration (subparameter of B Protocol, CONNECT_REQ, CONNECT_RESP
|
||||||
|
and SELECT_B_PROTOCOL_REQ)
|
||||||
|
|
||||||
|
Only those parameters appearing in the message type currently being processed
|
||||||
|
are actually used. Unused members should be set to zero.
|
||||||
|
|
||||||
Members are named after the CAPI 2.0 standard names of the parameters they
|
Members are named after the CAPI 2.0 standard names of the parameters they
|
||||||
represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data
|
represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data
|
||||||
|
@ -190,18 +217,19 @@ u16 for CAPI parameters of type 'word'
|
||||||
|
|
||||||
u32 for CAPI parameters of type 'dword'
|
u32 for CAPI parameters of type 'dword'
|
||||||
|
|
||||||
_cstruct for CAPI parameters of type 'struct' not containing any
|
_cstruct for CAPI parameters of type 'struct'
|
||||||
variably-sized (struct) subparameters (eg. 'Called Party Number')
|
|
||||||
The member is a pointer to a buffer containing the parameter in
|
The member is a pointer to a buffer containing the parameter in
|
||||||
CAPI encoding (length + content). It may also be NULL, which will
|
CAPI encoding (length + content). It may also be NULL, which will
|
||||||
be taken to represent an empty (zero length) parameter.
|
be taken to represent an empty (zero length) parameter.
|
||||||
|
Subparameters are stored in encoded form within the content part.
|
||||||
|
|
||||||
_cmstruct for CAPI parameters of type 'struct' containing 'struct'
|
_cmstruct alternative representation for CAPI parameters of type 'struct'
|
||||||
subparameters ('Additional Info' and 'B Protocol')
|
(used only for the 'Additional Info' and 'B Protocol' parameters)
|
||||||
The representation is a single byte containing one of the values:
|
The representation is a single byte containing one of the values:
|
||||||
CAPI_DEFAULT: the parameter is empty
|
CAPI_DEFAULT: The parameter is empty/absent.
|
||||||
CAPI_COMPOSE: the values of the subparameters are stored
|
CAPI_COMPOSE: The parameter is present.
|
||||||
individually in the corresponding _cmsg structure members
|
Subparameter values are stored individually in the corresponding
|
||||||
|
_cmsg structure members.
|
||||||
|
|
||||||
Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert
|
Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert
|
||||||
messages between their transport encoding described in the CAPI 2.0 standard
|
messages between their transport encoding described in the CAPI 2.0 standard
|
||||||
|
@ -297,3 +325,26 @@ char *capi_cmd2str(u8 Command, u8 Subcommand)
|
||||||
be NULL if the command/subcommand is not one of those defined in the
|
be NULL if the command/subcommand is not one of those defined in the
|
||||||
CAPI 2.0 standard.
|
CAPI 2.0 standard.
|
||||||
|
|
||||||
|
|
||||||
|
7. Debugging
|
||||||
|
|
||||||
|
The module kernelcapi has a module parameter showcapimsgs controlling some
|
||||||
|
debugging output produced by the module. It can only be set when the module is
|
||||||
|
loaded, via a parameter "showcapimsgs=<n>" to the modprobe command, either on
|
||||||
|
the command line or in the configuration file.
|
||||||
|
|
||||||
|
If the lowest bit of showcapimsgs is set, kernelcapi logs controller and
|
||||||
|
application up and down events.
|
||||||
|
|
||||||
|
In addition, every registered CAPI controller has an associated traceflag
|
||||||
|
parameter controlling how CAPI messages sent from and to tha controller are
|
||||||
|
logged. The traceflag parameter is initialized with the value of the
|
||||||
|
showcapimsgs parameter when the controller is registered, but can later be
|
||||||
|
changed via the MANUFACTURER_REQ command KCAPI_CMD_TRACE.
|
||||||
|
|
||||||
|
If the value of traceflag is non-zero, CAPI messages are logged.
|
||||||
|
DATA_B3 messages are only logged if the value of traceflag is > 2.
|
||||||
|
|
||||||
|
If the lowest bit of traceflag is set, only the command/subcommand and message
|
||||||
|
length are logged. Otherwise, kernelcapi logs a readable representation of
|
||||||
|
the entire message.
|
||||||
|
|
|
@ -90,6 +90,11 @@ Examples:
|
||||||
pgset "dstmac 00:00:00:00:00:00" sets MAC destination address
|
pgset "dstmac 00:00:00:00:00:00" sets MAC destination address
|
||||||
pgset "srcmac 00:00:00:00:00:00" sets MAC source address
|
pgset "srcmac 00:00:00:00:00:00" sets MAC source address
|
||||||
|
|
||||||
|
pgset "queue_map_min 0" Sets the min value of tx queue interval
|
||||||
|
pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices
|
||||||
|
To select queue 1 of a given device,
|
||||||
|
use queue_map_min=1 and queue_map_max=1
|
||||||
|
|
||||||
pgset "src_mac_count 1" Sets the number of MACs we'll range through.
|
pgset "src_mac_count 1" Sets the number of MACs we'll range through.
|
||||||
The 'minimum' MAC is what you set with srcmac.
|
The 'minimum' MAC is what you set with srcmac.
|
||||||
|
|
||||||
|
@ -101,6 +106,9 @@ Examples:
|
||||||
IPDST_RND, UDPSRC_RND,
|
IPDST_RND, UDPSRC_RND,
|
||||||
UDPDST_RND, MACSRC_RND, MACDST_RND
|
UDPDST_RND, MACSRC_RND, MACDST_RND
|
||||||
MPLS_RND, VID_RND, SVID_RND
|
MPLS_RND, VID_RND, SVID_RND
|
||||||
|
QUEUE_MAP_RND # queue map random
|
||||||
|
QUEUE_MAP_CPU # queue map mirrors smp_processor_id()
|
||||||
|
|
||||||
|
|
||||||
pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
|
pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
|
||||||
cycle through the port range.
|
cycle through the port range.
|
||||||
|
|
|
@ -227,7 +227,8 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
|
||||||
* cn_proc_mcast_ctl
|
* cn_proc_mcast_ctl
|
||||||
* @data: message sent from userspace via the connector
|
* @data: message sent from userspace via the connector
|
||||||
*/
|
*/
|
||||||
static void cn_proc_mcast_ctl(struct cn_msg *msg)
|
static void cn_proc_mcast_ctl(struct cn_msg *msg,
|
||||||
|
struct netlink_skb_parms *nsp)
|
||||||
{
|
{
|
||||||
enum proc_cn_mcast_op *mc_op = NULL;
|
enum proc_cn_mcast_op *mc_op = NULL;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
|
@ -603,7 +603,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
|
||||||
|
|
||||||
if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_CONF) {
|
if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_CONF) {
|
||||||
u16 info = CAPIMSG_U16(skb->data, 12); // Info field
|
u16 info = CAPIMSG_U16(skb->data, 12); // Info field
|
||||||
if (info == 0) {
|
if ((info & 0xff00) == 0) {
|
||||||
mutex_lock(&cdev->ncci_list_mtx);
|
mutex_lock(&cdev->ncci_list_mtx);
|
||||||
capincci_alloc(cdev, CAPIMSG_NCCI(skb->data));
|
capincci_alloc(cdev, CAPIMSG_NCCI(skb->data));
|
||||||
mutex_unlock(&cdev->ncci_list_mtx);
|
mutex_unlock(&cdev->ncci_list_mtx);
|
||||||
|
|
|
@ -40,7 +40,7 @@ static int debugmode = 0;
|
||||||
MODULE_DESCRIPTION("CAPI4Linux: Interface to ISDN4Linux");
|
MODULE_DESCRIPTION("CAPI4Linux: Interface to ISDN4Linux");
|
||||||
MODULE_AUTHOR("Carsten Paeth");
|
MODULE_AUTHOR("Carsten Paeth");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
module_param(debugmode, uint, 0);
|
module_param(debugmode, uint, S_IRUGO|S_IWUSR);
|
||||||
|
|
||||||
/* -------- type definitions ----------------------------------------- */
|
/* -------- type definitions ----------------------------------------- */
|
||||||
|
|
||||||
|
@ -671,8 +671,8 @@ static void n0(capidrv_contr * card, capidrv_ncci * ncci)
|
||||||
NULL, /* Useruserdata */ /* $$$$ */
|
NULL, /* Useruserdata */ /* $$$$ */
|
||||||
NULL /* Facilitydataarray */
|
NULL /* Facilitydataarray */
|
||||||
);
|
);
|
||||||
send_message(card, &cmsg);
|
|
||||||
plci_change_state(card, ncci->plcip, EV_PLCI_DISCONNECT_REQ);
|
plci_change_state(card, ncci->plcip, EV_PLCI_DISCONNECT_REQ);
|
||||||
|
send_message(card, &cmsg);
|
||||||
|
|
||||||
cmd.command = ISDN_STAT_BHUP;
|
cmd.command = ISDN_STAT_BHUP;
|
||||||
cmd.driver = card->myid;
|
cmd.driver = card->myid;
|
||||||
|
@ -924,8 +924,8 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
|
||||||
*/
|
*/
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
cmsg->Reject = 1; /* ignore */
|
cmsg->Reject = 1; /* ignore */
|
||||||
send_message(card, cmsg);
|
|
||||||
plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT);
|
plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT);
|
||||||
|
send_message(card, cmsg);
|
||||||
printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s ignored\n",
|
printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s ignored\n",
|
||||||
card->contrnr,
|
card->contrnr,
|
||||||
cmd.parm.setup.phone,
|
cmd.parm.setup.phone,
|
||||||
|
@ -974,8 +974,8 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
|
||||||
case 2: /* Call will be rejected. */
|
case 2: /* Call will be rejected. */
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
cmsg->Reject = 2; /* reject call, normal call clearing */
|
cmsg->Reject = 2; /* reject call, normal call clearing */
|
||||||
send_message(card, cmsg);
|
|
||||||
plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT);
|
plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT);
|
||||||
|
send_message(card, cmsg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -983,8 +983,8 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg)
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
cmsg->Reject = 8; /* reject call,
|
cmsg->Reject = 8; /* reject call,
|
||||||
destination out of order */
|
destination out of order */
|
||||||
send_message(card, cmsg);
|
|
||||||
plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT);
|
plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT);
|
||||||
|
send_message(card, cmsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -1020,8 +1020,8 @@ static void handle_plci(_cmsg * cmsg)
|
||||||
card->bchans[plcip->chan].disconnecting = 1;
|
card->bchans[plcip->chan].disconnecting = 1;
|
||||||
plci_change_state(card, plcip, EV_PLCI_DISCONNECT_IND);
|
plci_change_state(card, plcip, EV_PLCI_DISCONNECT_IND);
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
send_message(card, cmsg);
|
|
||||||
plci_change_state(card, plcip, EV_PLCI_DISCONNECT_RESP);
|
plci_change_state(card, plcip, EV_PLCI_DISCONNECT_RESP);
|
||||||
|
send_message(card, cmsg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CAPI_DISCONNECT_CONF: /* plci */
|
case CAPI_DISCONNECT_CONF: /* plci */
|
||||||
|
@ -1078,8 +1078,8 @@ static void handle_plci(_cmsg * cmsg)
|
||||||
|
|
||||||
if (card->bchans[plcip->chan].incoming) {
|
if (card->bchans[plcip->chan].incoming) {
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
send_message(card, cmsg);
|
|
||||||
plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND);
|
plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND);
|
||||||
|
send_message(card, cmsg);
|
||||||
} else {
|
} else {
|
||||||
capidrv_ncci *nccip;
|
capidrv_ncci *nccip;
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
|
@ -1098,13 +1098,14 @@ static void handle_plci(_cmsg * cmsg)
|
||||||
NULL /* NCPI */
|
NULL /* NCPI */
|
||||||
);
|
);
|
||||||
nccip->msgid = cmsg->Messagenumber;
|
nccip->msgid = cmsg->Messagenumber;
|
||||||
|
plci_change_state(card, plcip,
|
||||||
|
EV_PLCI_CONNECT_ACTIVE_IND);
|
||||||
|
ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_REQ);
|
||||||
send_message(card, cmsg);
|
send_message(card, cmsg);
|
||||||
cmd.command = ISDN_STAT_DCONN;
|
cmd.command = ISDN_STAT_DCONN;
|
||||||
cmd.driver = card->myid;
|
cmd.driver = card->myid;
|
||||||
cmd.arg = plcip->chan;
|
cmd.arg = plcip->chan;
|
||||||
card->interface.statcallb(&cmd);
|
card->interface.statcallb(&cmd);
|
||||||
plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND);
|
|
||||||
ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_REQ);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1193,8 +1194,8 @@ static void handle_ncci(_cmsg * cmsg)
|
||||||
goto notfound;
|
goto notfound;
|
||||||
|
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
send_message(card, cmsg);
|
|
||||||
ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_ACTIVE_IND);
|
ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_ACTIVE_IND);
|
||||||
|
send_message(card, cmsg);
|
||||||
|
|
||||||
cmd.command = ISDN_STAT_BCONN;
|
cmd.command = ISDN_STAT_BCONN;
|
||||||
cmd.driver = card->myid;
|
cmd.driver = card->myid;
|
||||||
|
@ -1222,8 +1223,8 @@ static void handle_ncci(_cmsg * cmsg)
|
||||||
0, /* Reject */
|
0, /* Reject */
|
||||||
NULL /* NCPI */
|
NULL /* NCPI */
|
||||||
);
|
);
|
||||||
send_message(card, cmsg);
|
|
||||||
ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_RESP);
|
ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_RESP);
|
||||||
|
send_message(card, cmsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printk(KERN_ERR "capidrv-%d: no mem for ncci, sorry\n", card->contrnr);
|
printk(KERN_ERR "capidrv-%d: no mem for ncci, sorry\n", card->contrnr);
|
||||||
|
@ -1299,8 +1300,8 @@ static void handle_ncci(_cmsg * cmsg)
|
||||||
card->bchans[nccip->chan].disconnecting = 1;
|
card->bchans[nccip->chan].disconnecting = 1;
|
||||||
ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_IND);
|
ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_IND);
|
||||||
capi_cmsg_answer(cmsg);
|
capi_cmsg_answer(cmsg);
|
||||||
send_message(card, cmsg);
|
|
||||||
ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_RESP);
|
ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_RESP);
|
||||||
|
send_message(card, cmsg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CAPI_DISCONNECT_B3_CONF: /* ncci */
|
case CAPI_DISCONNECT_B3_CONF: /* ncci */
|
||||||
|
@ -2014,8 +2015,8 @@ static void send_listen(capidrv_contr *card)
|
||||||
card->cipmask,
|
card->cipmask,
|
||||||
card->cipmask2,
|
card->cipmask2,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
send_message(card, &cmdcmsg);
|
|
||||||
listen_change_state(card, EV_LISTEN_REQ);
|
listen_change_state(card, EV_LISTEN_REQ);
|
||||||
|
send_message(card, &cmdcmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void listentimerfunc(unsigned long x)
|
static void listentimerfunc(unsigned long x)
|
||||||
|
|
|
@ -334,7 +334,14 @@ static inline int iraw_loop(unsigned char c, unsigned char *src, int numbytes,
|
||||||
return startbytes - numbytes;
|
return startbytes - numbytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* process a block of data received from the device
|
/**
|
||||||
|
* gigaset_m10x_input() - process a block of data received from the device
|
||||||
|
* @inbuf: received data and device descriptor structure.
|
||||||
|
*
|
||||||
|
* Called by hardware module {ser,usb}_gigaset with a block of received
|
||||||
|
* bytes. Separates the bytes received over the serial data channel into
|
||||||
|
* user data and command replies (locked/unlocked) according to the
|
||||||
|
* current state of the interface.
|
||||||
*/
|
*/
|
||||||
void gigaset_m10x_input(struct inbuf_t *inbuf)
|
void gigaset_m10x_input(struct inbuf_t *inbuf)
|
||||||
{
|
{
|
||||||
|
@ -543,16 +550,17 @@ static struct sk_buff *iraw_encode(struct sk_buff *skb, int head, int tail)
|
||||||
return iraw_skb;
|
return iraw_skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gigaset_send_skb
|
/**
|
||||||
* called by common.c to queue an skb for sending
|
* gigaset_m10x_send_skb() - queue an skb for sending
|
||||||
* and start transmission if necessary
|
* @bcs: B channel descriptor structure.
|
||||||
* parameters:
|
* @skb: data to send.
|
||||||
* B Channel control structure
|
*
|
||||||
* skb
|
* Called by i4l.c to encode and queue an skb for sending, and start
|
||||||
|
* transmission if necessary.
|
||||||
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* number of bytes accepted for sending
|
* number of bytes accepted for sending (skb->len) if ok,
|
||||||
* (skb->len if ok, 0 if out of buffer space)
|
* error code < 0 (eg. -ENOMEM) on error
|
||||||
* or error code (< 0, eg. -EINVAL)
|
|
||||||
*/
|
*/
|
||||||
int gigaset_m10x_send_skb(struct bc_state *bcs, struct sk_buff *skb)
|
int gigaset_m10x_send_skb(struct bc_state *bcs, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
|
|
@ -134,6 +134,7 @@ struct bas_cardstate {
|
||||||
#define BS_ATRDPEND 0x040 /* urb_cmd_in in use */
|
#define BS_ATRDPEND 0x040 /* urb_cmd_in in use */
|
||||||
#define BS_ATWRPEND 0x080 /* urb_cmd_out in use */
|
#define BS_ATWRPEND 0x080 /* urb_cmd_out in use */
|
||||||
#define BS_SUSPEND 0x100 /* USB port suspended */
|
#define BS_SUSPEND 0x100 /* USB port suspended */
|
||||||
|
#define BS_RESETTING 0x200 /* waiting for HD_RESET_INTERRUPT_PIPE_ACK */
|
||||||
|
|
||||||
|
|
||||||
static struct gigaset_driver *driver = NULL;
|
static struct gigaset_driver *driver = NULL;
|
||||||
|
@ -319,6 +320,21 @@ static int gigaset_set_line_ctrl(struct cardstate *cs, unsigned cflag)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set/clear bits in base connection state, return previous state
|
||||||
|
*/
|
||||||
|
static inline int update_basstate(struct bas_cardstate *ucs,
|
||||||
|
int set, int clear)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
int state;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&ucs->lock, flags);
|
||||||
|
state = ucs->basstate;
|
||||||
|
ucs->basstate = (state & ~clear) | set;
|
||||||
|
spin_unlock_irqrestore(&ucs->lock, flags);
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
/* error_hangup
|
/* error_hangup
|
||||||
* hang up any existing connection because of an unrecoverable error
|
* hang up any existing connection because of an unrecoverable error
|
||||||
* This function may be called from any context and takes care of scheduling
|
* This function may be called from any context and takes care of scheduling
|
||||||
|
@ -350,12 +366,9 @@ static inline void error_hangup(struct bc_state *bcs)
|
||||||
*/
|
*/
|
||||||
static inline void error_reset(struct cardstate *cs)
|
static inline void error_reset(struct cardstate *cs)
|
||||||
{
|
{
|
||||||
/* close AT command channel to recover (ignore errors) */
|
/* reset interrupt pipe to recover (ignore errors) */
|
||||||
req_submit(cs->bcs, HD_CLOSE_ATCHANNEL, 0, BAS_TIMEOUT);
|
update_basstate(cs->hw.bas, BS_RESETTING, 0);
|
||||||
|
req_submit(cs->bcs, HD_RESET_INTERRUPT_PIPE, 0, BAS_TIMEOUT);
|
||||||
//FIXME try to recover without bothering the user
|
|
||||||
dev_err(cs->dev,
|
|
||||||
"unrecoverable error - please disconnect Gigaset base to reset\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check_pending
|
/* check_pending
|
||||||
|
@ -398,8 +411,13 @@ static void check_pending(struct bas_cardstate *ucs)
|
||||||
case HD_DEVICE_INIT_ACK: /* no reply expected */
|
case HD_DEVICE_INIT_ACK: /* no reply expected */
|
||||||
ucs->pending = 0;
|
ucs->pending = 0;
|
||||||
break;
|
break;
|
||||||
/* HD_READ_ATMESSAGE, HD_WRITE_ATMESSAGE, HD_RESET_INTERRUPTPIPE
|
case HD_RESET_INTERRUPT_PIPE:
|
||||||
* are handled separately and should never end up here
|
if (!(ucs->basstate & BS_RESETTING))
|
||||||
|
ucs->pending = 0;
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
* HD_READ_ATMESSAGE and HD_WRITE_ATMESSAGE are handled separately
|
||||||
|
* and should never end up here
|
||||||
*/
|
*/
|
||||||
default:
|
default:
|
||||||
dev_warn(&ucs->interface->dev,
|
dev_warn(&ucs->interface->dev,
|
||||||
|
@ -449,21 +467,6 @@ static void cmd_in_timeout(unsigned long data)
|
||||||
error_reset(cs);
|
error_reset(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set/clear bits in base connection state, return previous state
|
|
||||||
*/
|
|
||||||
inline static int update_basstate(struct bas_cardstate *ucs,
|
|
||||||
int set, int clear)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
int state;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&ucs->lock, flags);
|
|
||||||
state = ucs->basstate;
|
|
||||||
ucs->basstate = (state & ~clear) | set;
|
|
||||||
spin_unlock_irqrestore(&ucs->lock, flags);
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read_ctrl_callback
|
/* read_ctrl_callback
|
||||||
* USB completion handler for control pipe input
|
* USB completion handler for control pipe input
|
||||||
* called by the USB subsystem in interrupt context
|
* called by the USB subsystem in interrupt context
|
||||||
|
@ -762,7 +765,8 @@ static void read_int_callback(struct urb *urb)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HD_RESET_INTERRUPT_PIPE_ACK:
|
case HD_RESET_INTERRUPT_PIPE_ACK:
|
||||||
gig_dbg(DEBUG_USBREQ, "HD_RESET_INTERRUPT_PIPE_ACK");
|
update_basstate(ucs, 0, BS_RESETTING);
|
||||||
|
dev_notice(cs->dev, "interrupt pipe reset\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HD_SUSPEND_END:
|
case HD_SUSPEND_END:
|
||||||
|
@ -1331,28 +1335,24 @@ static void read_iso_tasklet(unsigned long data)
|
||||||
rcvbuf = urb->transfer_buffer;
|
rcvbuf = urb->transfer_buffer;
|
||||||
totleft = urb->actual_length;
|
totleft = urb->actual_length;
|
||||||
for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) {
|
for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) {
|
||||||
if (unlikely(urb->iso_frame_desc[frame].status)) {
|
numbytes = urb->iso_frame_desc[frame].actual_length;
|
||||||
|
if (unlikely(urb->iso_frame_desc[frame].status))
|
||||||
dev_warn(cs->dev,
|
dev_warn(cs->dev,
|
||||||
"isochronous read: frame %d: %s\n",
|
"isochronous read: frame %d[%d]: %s\n",
|
||||||
frame,
|
frame, numbytes,
|
||||||
get_usb_statmsg(
|
get_usb_statmsg(
|
||||||
urb->iso_frame_desc[frame].status));
|
urb->iso_frame_desc[frame].status));
|
||||||
break;
|
if (unlikely(numbytes > BAS_MAXFRAME))
|
||||||
}
|
|
||||||
numbytes = urb->iso_frame_desc[frame].actual_length;
|
|
||||||
if (unlikely(numbytes > BAS_MAXFRAME)) {
|
|
||||||
dev_warn(cs->dev,
|
dev_warn(cs->dev,
|
||||||
"isochronous read: frame %d: "
|
"isochronous read: frame %d: "
|
||||||
"numbytes (%d) > BAS_MAXFRAME\n",
|
"numbytes (%d) > BAS_MAXFRAME\n",
|
||||||
frame, numbytes);
|
frame, numbytes);
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (unlikely(numbytes > totleft)) {
|
if (unlikely(numbytes > totleft)) {
|
||||||
dev_warn(cs->dev,
|
dev_warn(cs->dev,
|
||||||
"isochronous read: frame %d: "
|
"isochronous read: frame %d: "
|
||||||
"numbytes (%d) > totleft (%d)\n",
|
"numbytes (%d) > totleft (%d)\n",
|
||||||
frame, numbytes, totleft);
|
frame, numbytes, totleft);
|
||||||
break;
|
numbytes = totleft;
|
||||||
}
|
}
|
||||||
offset = urb->iso_frame_desc[frame].offset;
|
offset = urb->iso_frame_desc[frame].offset;
|
||||||
if (unlikely(offset + numbytes > BAS_INBUFSIZE)) {
|
if (unlikely(offset + numbytes > BAS_INBUFSIZE)) {
|
||||||
|
@ -1361,7 +1361,7 @@ static void read_iso_tasklet(unsigned long data)
|
||||||
"offset (%d) + numbytes (%d) "
|
"offset (%d) + numbytes (%d) "
|
||||||
"> BAS_INBUFSIZE\n",
|
"> BAS_INBUFSIZE\n",
|
||||||
frame, offset, numbytes);
|
frame, offset, numbytes);
|
||||||
break;
|
numbytes = BAS_INBUFSIZE - offset;
|
||||||
}
|
}
|
||||||
gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs);
|
gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs);
|
||||||
totleft -= numbytes;
|
totleft -= numbytes;
|
||||||
|
@ -1433,6 +1433,7 @@ static void req_timeout(unsigned long data)
|
||||||
|
|
||||||
case HD_CLOSE_ATCHANNEL:
|
case HD_CLOSE_ATCHANNEL:
|
||||||
dev_err(bcs->cs->dev, "timeout closing AT channel\n");
|
dev_err(bcs->cs->dev, "timeout closing AT channel\n");
|
||||||
|
error_reset(bcs->cs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HD_CLOSE_B2CHANNEL:
|
case HD_CLOSE_B2CHANNEL:
|
||||||
|
@ -1442,6 +1443,13 @@ static void req_timeout(unsigned long data)
|
||||||
error_reset(bcs->cs);
|
error_reset(bcs->cs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HD_RESET_INTERRUPT_PIPE:
|
||||||
|
/* error recovery escalation */
|
||||||
|
dev_err(bcs->cs->dev,
|
||||||
|
"reset interrupt pipe timeout, attempting USB reset\n");
|
||||||
|
usb_queue_reset_device(bcs->cs->hw.bas->interface);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
dev_warn(bcs->cs->dev, "request 0x%02x timed out, clearing\n",
|
dev_warn(bcs->cs->dev, "request 0x%02x timed out, clearing\n",
|
||||||
pending);
|
pending);
|
||||||
|
@ -1934,6 +1942,15 @@ static int gigaset_write_cmd(struct cardstate *cs,
|
||||||
goto notqueued;
|
goto notqueued;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* translate "+++" escape sequence sent as a single separate command
|
||||||
|
* into "close AT channel" command for error recovery
|
||||||
|
* The next command will reopen the AT channel automatically.
|
||||||
|
*/
|
||||||
|
if (len == 3 && !memcmp(buf, "+++", 3)) {
|
||||||
|
rc = req_submit(cs->bcs, HD_CLOSE_ATCHANNEL, 0, BAS_TIMEOUT);
|
||||||
|
goto notqueued;
|
||||||
|
}
|
||||||
|
|
||||||
if (len > IF_WRITEBUF)
|
if (len > IF_WRITEBUF)
|
||||||
len = IF_WRITEBUF;
|
len = IF_WRITEBUF;
|
||||||
if (!(cb = kmalloc(sizeof(struct cmdbuf_t) + len, GFP_ATOMIC))) {
|
if (!(cb = kmalloc(sizeof(struct cmdbuf_t) + len, GFP_ATOMIC))) {
|
||||||
|
|
|
@ -22,6 +22,12 @@
|
||||||
#define DRIVER_AUTHOR "Hansjoerg Lipp <hjlipp@web.de>, Tilman Schmidt <tilman@imap.cc>, Stefan Eilers"
|
#define DRIVER_AUTHOR "Hansjoerg Lipp <hjlipp@web.de>, Tilman Schmidt <tilman@imap.cc>, Stefan Eilers"
|
||||||
#define DRIVER_DESC "Driver for Gigaset 307x"
|
#define DRIVER_DESC "Driver for Gigaset 307x"
|
||||||
|
|
||||||
|
#ifdef CONFIG_GIGASET_DEBUG
|
||||||
|
#define DRIVER_DESC_DEBUG " (debug build)"
|
||||||
|
#else
|
||||||
|
#define DRIVER_DESC_DEBUG ""
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Module parameters */
|
/* Module parameters */
|
||||||
int gigaset_debuglevel = DEBUG_DEFAULT;
|
int gigaset_debuglevel = DEBUG_DEFAULT;
|
||||||
EXPORT_SYMBOL_GPL(gigaset_debuglevel);
|
EXPORT_SYMBOL_GPL(gigaset_debuglevel);
|
||||||
|
@ -32,6 +38,17 @@ MODULE_PARM_DESC(debug, "debug level");
|
||||||
#define VALID_MINOR 0x01
|
#define VALID_MINOR 0x01
|
||||||
#define VALID_ID 0x02
|
#define VALID_ID 0x02
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_dbg_buffer() - dump data in ASCII and hex for debugging
|
||||||
|
* @level: debugging level.
|
||||||
|
* @msg: message prefix.
|
||||||
|
* @len: number of bytes to dump.
|
||||||
|
* @buf: data to dump.
|
||||||
|
*
|
||||||
|
* If the current debugging level includes one of the bits set in @level,
|
||||||
|
* @len bytes starting at @buf are logged to dmesg at KERN_DEBUG prio,
|
||||||
|
* prefixed by the text @msg.
|
||||||
|
*/
|
||||||
void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
|
void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
|
||||||
size_t len, const unsigned char *buf)
|
size_t len, const unsigned char *buf)
|
||||||
{
|
{
|
||||||
|
@ -274,6 +291,20 @@ static void clear_events(struct cardstate *cs)
|
||||||
spin_unlock_irqrestore(&cs->ev_lock, flags);
|
spin_unlock_irqrestore(&cs->ev_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_add_event() - add event to device event queue
|
||||||
|
* @cs: device descriptor structure.
|
||||||
|
* @at_state: connection state structure.
|
||||||
|
* @type: event type.
|
||||||
|
* @ptr: pointer parameter for event.
|
||||||
|
* @parameter: integer parameter for event.
|
||||||
|
* @arg: pointer parameter for event.
|
||||||
|
*
|
||||||
|
* Allocate an event queue entry from the device's event queue, and set it up
|
||||||
|
* with the parameters given.
|
||||||
|
*
|
||||||
|
* Return value: added event
|
||||||
|
*/
|
||||||
struct event_t *gigaset_add_event(struct cardstate *cs,
|
struct event_t *gigaset_add_event(struct cardstate *cs,
|
||||||
struct at_state_t *at_state, int type,
|
struct at_state_t *at_state, int type,
|
||||||
void *ptr, int parameter, void *arg)
|
void *ptr, int parameter, void *arg)
|
||||||
|
@ -398,6 +429,15 @@ static void make_invalid(struct cardstate *cs, unsigned mask)
|
||||||
spin_unlock_irqrestore(&drv->lock, flags);
|
spin_unlock_irqrestore(&drv->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_freecs() - free all associated ressources of a device
|
||||||
|
* @cs: device descriptor structure.
|
||||||
|
*
|
||||||
|
* Stops all tasklets and timers, unregisters the device from all
|
||||||
|
* subsystems it was registered to, deallocates the device structure
|
||||||
|
* @cs and all structures referenced from it.
|
||||||
|
* Operations on the device should be stopped before calling this.
|
||||||
|
*/
|
||||||
void gigaset_freecs(struct cardstate *cs)
|
void gigaset_freecs(struct cardstate *cs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -506,7 +546,12 @@ static void gigaset_inbuf_init(struct inbuf_t *inbuf, struct bc_state *bcs,
|
||||||
inbuf->inputstate = inputstate;
|
inbuf->inputstate = inputstate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* append received bytes to inbuf */
|
/**
|
||||||
|
* gigaset_fill_inbuf() - append received data to input buffer
|
||||||
|
* @inbuf: buffer structure.
|
||||||
|
* @src: received data.
|
||||||
|
* @numbytes: number of bytes received.
|
||||||
|
*/
|
||||||
int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src,
|
int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src,
|
||||||
unsigned numbytes)
|
unsigned numbytes)
|
||||||
{
|
{
|
||||||
|
@ -606,20 +651,22 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gigaset_initcs
|
/**
|
||||||
|
* gigaset_initcs() - initialize device structure
|
||||||
|
* @drv: hardware driver the device belongs to
|
||||||
|
* @channels: number of B channels supported by device
|
||||||
|
* @onechannel: !=0 if B channel data and AT commands share one
|
||||||
|
* communication channel (M10x),
|
||||||
|
* ==0 if B channels have separate communication channels (base)
|
||||||
|
* @ignoreframes: number of frames to ignore after setting up B channel
|
||||||
|
* @cidmode: !=0: start in CallID mode
|
||||||
|
* @modulename: name of driver module for LL registration
|
||||||
|
*
|
||||||
* Allocate and initialize cardstate structure for Gigaset driver
|
* Allocate and initialize cardstate structure for Gigaset driver
|
||||||
* Calls hardware dependent gigaset_initcshw() function
|
* Calls hardware dependent gigaset_initcshw() function
|
||||||
* Calls B channel initialization function gigaset_initbcs() for each B channel
|
* Calls B channel initialization function gigaset_initbcs() for each B channel
|
||||||
* parameters:
|
*
|
||||||
* drv hardware driver the device belongs to
|
* Return value:
|
||||||
* channels number of B channels supported by device
|
|
||||||
* onechannel !=0: B channel data and AT commands share one
|
|
||||||
* communication channel
|
|
||||||
* ==0: B channels have separate communication channels
|
|
||||||
* ignoreframes number of frames to ignore after setting up B channel
|
|
||||||
* cidmode !=0: start in CallID mode
|
|
||||||
* modulename name of driver module (used for I4L registration)
|
|
||||||
* return value:
|
|
||||||
* pointer to cardstate structure
|
* pointer to cardstate structure
|
||||||
*/
|
*/
|
||||||
struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
|
struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
|
||||||
|
@ -837,6 +884,17 @@ static void cleanup_cs(struct cardstate *cs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_start() - start device operations
|
||||||
|
* @cs: device descriptor structure.
|
||||||
|
*
|
||||||
|
* Prepares the device for use by setting up communication parameters,
|
||||||
|
* scheduling an EV_START event to initiate device initialization, and
|
||||||
|
* waiting for completion of the initialization.
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* 1 - success, 0 - error
|
||||||
|
*/
|
||||||
int gigaset_start(struct cardstate *cs)
|
int gigaset_start(struct cardstate *cs)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -879,9 +937,15 @@ error:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gigaset_start);
|
EXPORT_SYMBOL_GPL(gigaset_start);
|
||||||
|
|
||||||
/* gigaset_shutdown
|
/**
|
||||||
* check if a device is associated to the cardstate structure and stop it
|
* gigaset_shutdown() - shut down device operations
|
||||||
* return value: 0 if ok, -1 if no device was associated
|
* @cs: device descriptor structure.
|
||||||
|
*
|
||||||
|
* Deactivates the device by scheduling an EV_SHUTDOWN event and
|
||||||
|
* waiting for completion of the shutdown.
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* 0 - success, -1 - error (no device associated)
|
||||||
*/
|
*/
|
||||||
int gigaset_shutdown(struct cardstate *cs)
|
int gigaset_shutdown(struct cardstate *cs)
|
||||||
{
|
{
|
||||||
|
@ -912,6 +976,13 @@ exit:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gigaset_shutdown);
|
EXPORT_SYMBOL_GPL(gigaset_shutdown);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_stop() - stop device operations
|
||||||
|
* @cs: device descriptor structure.
|
||||||
|
*
|
||||||
|
* Stops operations on the device by scheduling an EV_STOP event and
|
||||||
|
* waiting for completion of the shutdown.
|
||||||
|
*/
|
||||||
void gigaset_stop(struct cardstate *cs)
|
void gigaset_stop(struct cardstate *cs)
|
||||||
{
|
{
|
||||||
mutex_lock(&cs->mutex);
|
mutex_lock(&cs->mutex);
|
||||||
|
@ -1020,6 +1091,14 @@ struct cardstate *gigaset_get_cs_by_tty(struct tty_struct *tty)
|
||||||
return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start);
|
return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_freedriver() - free all associated ressources of a driver
|
||||||
|
* @drv: driver descriptor structure.
|
||||||
|
*
|
||||||
|
* Unregisters the driver from the system and deallocates the driver
|
||||||
|
* structure @drv and all structures referenced from it.
|
||||||
|
* All devices should be shut down before calling this.
|
||||||
|
*/
|
||||||
void gigaset_freedriver(struct gigaset_driver *drv)
|
void gigaset_freedriver(struct gigaset_driver *drv)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -1035,14 +1114,16 @@ void gigaset_freedriver(struct gigaset_driver *drv)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gigaset_freedriver);
|
EXPORT_SYMBOL_GPL(gigaset_freedriver);
|
||||||
|
|
||||||
/* gigaset_initdriver
|
/**
|
||||||
|
* gigaset_initdriver() - initialize driver structure
|
||||||
|
* @minor: First minor number
|
||||||
|
* @minors: Number of minors this driver can handle
|
||||||
|
* @procname: Name of the driver
|
||||||
|
* @devname: Name of the device files (prefix without minor number)
|
||||||
|
*
|
||||||
* Allocate and initialize gigaset_driver structure. Initialize interface.
|
* Allocate and initialize gigaset_driver structure. Initialize interface.
|
||||||
* parameters:
|
*
|
||||||
* minor First minor number
|
* Return value:
|
||||||
* minors Number of minors this driver can handle
|
|
||||||
* procname Name of the driver
|
|
||||||
* devname Name of the device files (prefix without minor number)
|
|
||||||
* return value:
|
|
||||||
* Pointer to the gigaset_driver structure on success, NULL on failure.
|
* Pointer to the gigaset_driver structure on success, NULL on failure.
|
||||||
*/
|
*/
|
||||||
struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors,
|
struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors,
|
||||||
|
@ -1095,6 +1176,13 @@ error:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gigaset_initdriver);
|
EXPORT_SYMBOL_GPL(gigaset_initdriver);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_blockdriver() - block driver
|
||||||
|
* @drv: driver descriptor structure.
|
||||||
|
*
|
||||||
|
* Prevents the driver from attaching new devices, in preparation for
|
||||||
|
* deregistration.
|
||||||
|
*/
|
||||||
void gigaset_blockdriver(struct gigaset_driver *drv)
|
void gigaset_blockdriver(struct gigaset_driver *drv)
|
||||||
{
|
{
|
||||||
drv->blocked = 1;
|
drv->blocked = 1;
|
||||||
|
@ -1110,7 +1198,7 @@ static int __init gigaset_init_module(void)
|
||||||
if (gigaset_debuglevel == 1)
|
if (gigaset_debuglevel == 1)
|
||||||
gigaset_debuglevel = DEBUG_DEFAULT;
|
gigaset_debuglevel = DEBUG_DEFAULT;
|
||||||
|
|
||||||
pr_info(DRIVER_DESC "\n");
|
pr_info(DRIVER_DESC DRIVER_DESC_DEBUG "\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -207,7 +207,6 @@ struct reply_t gigaset_tab_nocid[] =
|
||||||
/* leave dle mode */
|
/* leave dle mode */
|
||||||
{RSP_INIT, 0, 0,SEQ_DLE0, 201, 5, {0}, "^SDLE=0\r"},
|
{RSP_INIT, 0, 0,SEQ_DLE0, 201, 5, {0}, "^SDLE=0\r"},
|
||||||
{RSP_OK, 201,201, -1, 202,-1},
|
{RSP_OK, 201,201, -1, 202,-1},
|
||||||
//{RSP_ZDLE, 202,202, 0, 202, 0, {ACT_ERROR}},//DELETE
|
|
||||||
{RSP_ZDLE, 202,202, 0, 0, 0, {ACT_DLE0}},
|
{RSP_ZDLE, 202,202, 0, 0, 0, {ACT_DLE0}},
|
||||||
{RSP_NODEV, 200,249, -1, 0, 0, {ACT_FAKEDLE0}},
|
{RSP_NODEV, 200,249, -1, 0, 0, {ACT_FAKEDLE0}},
|
||||||
{RSP_ERROR, 200,249, -1, 0, 0, {ACT_FAILDLE0}},
|
{RSP_ERROR, 200,249, -1, 0, 0, {ACT_FAILDLE0}},
|
||||||
|
@ -265,6 +264,7 @@ struct reply_t gigaset_tab_nocid[] =
|
||||||
{EV_SHUTDOWN, -1, -1, -1, -1,-1, {ACT_SHUTDOWN}}, //FIXME
|
{EV_SHUTDOWN, -1, -1, -1, -1,-1, {ACT_SHUTDOWN}}, //FIXME
|
||||||
|
|
||||||
/* misc. */
|
/* misc. */
|
||||||
|
{RSP_ERROR, -1, -1, -1, -1, -1, {ACT_ERROR} },
|
||||||
{RSP_EMPTY, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME
|
{RSP_EMPTY, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME
|
||||||
{RSP_ZCFGT, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME
|
{RSP_ZCFGT, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME
|
||||||
{RSP_ZCFG, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME
|
{RSP_ZCFG, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME
|
||||||
|
@ -328,10 +328,9 @@ struct reply_t gigaset_tab_cid[] =
|
||||||
{RSP_INIT, -1, -1,SEQ_HUP, 401, 5, {0}, "+VLS=0\r"}, /* hang up */ //-1,-1?
|
{RSP_INIT, -1, -1,SEQ_HUP, 401, 5, {0}, "+VLS=0\r"}, /* hang up */ //-1,-1?
|
||||||
{RSP_OK, 401,401, -1, 402, 5},
|
{RSP_OK, 401,401, -1, 402, 5},
|
||||||
{RSP_ZVLS, 402,402, 0, 403, 5},
|
{RSP_ZVLS, 402,402, 0, 403, 5},
|
||||||
{RSP_ZSAU, 403,403,ZSAU_DISCONNECT_REQ, -1,-1, {ACT_DEBUG}}, /* if not remote hup */
|
{RSP_ZSAU, 403, 403, ZSAU_DISCONNECT_REQ, -1, -1, {ACT_DEBUG} },
|
||||||
//{RSP_ZSAU, 403,403,ZSAU_NULL, 401, 0, {ACT_ERROR}}, //DELETE//FIXME -> DLE0 // should we do this _before_ hanging up for base driver?
|
{RSP_ZSAU, 403, 403, ZSAU_NULL, 0, 0, {ACT_DISCONNECT} },
|
||||||
{RSP_ZSAU, 403,403,ZSAU_NULL, 0, 0, {ACT_DISCONNECT}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver?
|
{RSP_NODEV, 401, 403, -1, 0, 0, {ACT_FAKEHUP} },
|
||||||
{RSP_NODEV, 401,403, -1, 0, 0, {ACT_FAKEHUP}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver?
|
|
||||||
{RSP_ERROR, 401,401, -1, 0, 0, {ACT_ABORTHUP}},
|
{RSP_ERROR, 401,401, -1, 0, 0, {ACT_ABORTHUP}},
|
||||||
{EV_TIMEOUT, 401,403, -1, 0, 0, {ACT_ABORTHUP}},
|
{EV_TIMEOUT, 401,403, -1, 0, 0, {ACT_ABORTHUP}},
|
||||||
|
|
||||||
|
@ -474,8 +473,13 @@ static int cid_of_response(char *s)
|
||||||
//FIXME is ;<digit>+ at end of non-CID response really impossible?
|
//FIXME is ;<digit>+ at end of non-CID response really impossible?
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function will be called via task queue from the callback handler.
|
/**
|
||||||
* We received a modem response and have to handle it..
|
* gigaset_handle_modem_response() - process received modem response
|
||||||
|
* @cs: device descriptor structure.
|
||||||
|
*
|
||||||
|
* Called by asyncdata/isocdata if a block of data received from the
|
||||||
|
* device must be processed as a modem command response. The data is
|
||||||
|
* already in the cs structure.
|
||||||
*/
|
*/
|
||||||
void gigaset_handle_modem_response(struct cardstate *cs)
|
void gigaset_handle_modem_response(struct cardstate *cs)
|
||||||
{
|
{
|
||||||
|
@ -707,6 +711,11 @@ static void disconnect(struct at_state_t **at_state_p)
|
||||||
if (bcs) {
|
if (bcs) {
|
||||||
/* B channel assigned: invoke hardware specific handler */
|
/* B channel assigned: invoke hardware specific handler */
|
||||||
cs->ops->close_bchannel(bcs);
|
cs->ops->close_bchannel(bcs);
|
||||||
|
/* notify LL */
|
||||||
|
if (bcs->chstate & (CHS_D_UP | CHS_NOTIFY_LL)) {
|
||||||
|
bcs->chstate &= ~(CHS_D_UP | CHS_NOTIFY_LL);
|
||||||
|
gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DHUP);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* no B channel assigned: just deallocate */
|
/* no B channel assigned: just deallocate */
|
||||||
spin_lock_irqsave(&cs->lock, flags);
|
spin_lock_irqsave(&cs->lock, flags);
|
||||||
|
@ -1429,11 +1438,12 @@ static void do_action(int action, struct cardstate *cs,
|
||||||
cs->gotfwver = -1;
|
cs->gotfwver = -1;
|
||||||
dev_err(cs->dev, "could not read firmware version.\n");
|
dev_err(cs->dev, "could not read firmware version.\n");
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_GIGASET_DEBUG
|
|
||||||
case ACT_ERROR:
|
case ACT_ERROR:
|
||||||
*p_genresp = 1;
|
gig_dbg(DEBUG_ANY, "%s: ERROR response in ConState %d",
|
||||||
*p_resp_code = RSP_ERROR;
|
__func__, at_state->ConState);
|
||||||
|
cs->cur_at_seq = SEQ_NONE;
|
||||||
break;
|
break;
|
||||||
|
#ifdef CONFIG_GIGASET_DEBUG
|
||||||
case ACT_TEST:
|
case ACT_TEST:
|
||||||
{
|
{
|
||||||
static int count = 3; //2; //1;
|
static int count = 3; //2; //1;
|
||||||
|
|
|
@ -51,6 +51,12 @@ static int writebuf_from_LL(int driverID, int channel, int ack,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
bcs = &cs->bcs[channel];
|
bcs = &cs->bcs[channel];
|
||||||
|
|
||||||
|
/* can only handle linear sk_buffs */
|
||||||
|
if (skb_linearize(skb) < 0) {
|
||||||
|
dev_err(cs->dev, "%s: skb_linearize failed\n", __func__);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
len = skb->len;
|
len = skb->len;
|
||||||
|
|
||||||
gig_dbg(DEBUG_LLDATA,
|
gig_dbg(DEBUG_LLDATA,
|
||||||
|
@ -79,6 +85,14 @@ static int writebuf_from_LL(int driverID, int channel, int ack,
|
||||||
return cs->ops->send_skb(bcs, skb);
|
return cs->ops->send_skb(bcs, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_skb_sent() - acknowledge sending an skb
|
||||||
|
* @bcs: B channel descriptor structure.
|
||||||
|
* @skb: sent data.
|
||||||
|
*
|
||||||
|
* Called by hardware module {bas,ser,usb}_gigaset when the data in a
|
||||||
|
* skb has been successfully sent, for signalling completion to the LL.
|
||||||
|
*/
|
||||||
void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb)
|
void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
unsigned len;
|
unsigned len;
|
||||||
|
@ -455,6 +469,15 @@ int gigaset_isdn_setup_accept(struct at_state_t *at_state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_isdn_icall() - signal incoming call
|
||||||
|
* @at_state: connection state structure.
|
||||||
|
*
|
||||||
|
* Called by main module to notify the LL that an incoming call has been
|
||||||
|
* received. @at_state contains the parameters of the call.
|
||||||
|
*
|
||||||
|
* Return value: call disposition (ICALL_*)
|
||||||
|
*/
|
||||||
int gigaset_isdn_icall(struct at_state_t *at_state)
|
int gigaset_isdn_icall(struct at_state_t *at_state)
|
||||||
{
|
{
|
||||||
struct cardstate *cs = at_state->cs;
|
struct cardstate *cs = at_state->cs;
|
||||||
|
|
|
@ -616,6 +616,15 @@ void gigaset_if_free(struct cardstate *cs)
|
||||||
tty_unregister_device(drv->tty, cs->minor_index);
|
tty_unregister_device(drv->tty, cs->minor_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gigaset_if_receive() - pass a received block of data to the tty device
|
||||||
|
* @cs: device descriptor structure.
|
||||||
|
* @buffer: received data.
|
||||||
|
* @len: number of bytes received.
|
||||||
|
*
|
||||||
|
* Called by asyncdata/isocdata if a block of data received from the
|
||||||
|
* device must be sent to userspace through the ttyG* device.
|
||||||
|
*/
|
||||||
void gigaset_if_receive(struct cardstate *cs,
|
void gigaset_if_receive(struct cardstate *cs,
|
||||||
unsigned char *buffer, size_t len)
|
unsigned char *buffer, size_t len)
|
||||||
{
|
{
|
||||||
|
|
|
@ -429,7 +429,7 @@ static inline int hdlc_buildframe(struct isowbuf_t *iwb,
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
dump_bytes(DEBUG_STREAM, "snd data", in, count);
|
dump_bytes(DEBUG_STREAM_DUMP, "snd data", in, count);
|
||||||
|
|
||||||
/* bitstuff and checksum input data */
|
/* bitstuff and checksum input data */
|
||||||
fcs = PPP_INITFCS;
|
fcs = PPP_INITFCS;
|
||||||
|
@ -448,7 +448,6 @@ static inline int hdlc_buildframe(struct isowbuf_t *iwb,
|
||||||
/* put closing flag and repeat byte for flag idle */
|
/* put closing flag and repeat byte for flag idle */
|
||||||
isowbuf_putflag(iwb);
|
isowbuf_putflag(iwb);
|
||||||
end = isowbuf_donewrite(iwb);
|
end = isowbuf_donewrite(iwb);
|
||||||
dump_bytes(DEBUG_STREAM_DUMP, "isowbuf", iwb->data, end + 1);
|
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,6 +481,8 @@ static inline int trans_buildframe(struct isowbuf_t *iwb,
|
||||||
}
|
}
|
||||||
|
|
||||||
gig_dbg(DEBUG_STREAM, "put %d bytes", count);
|
gig_dbg(DEBUG_STREAM, "put %d bytes", count);
|
||||||
|
dump_bytes(DEBUG_STREAM_DUMP, "snd data", in, count);
|
||||||
|
|
||||||
write = iwb->write;
|
write = iwb->write;
|
||||||
do {
|
do {
|
||||||
c = bitrev8(*in++);
|
c = bitrev8(*in++);
|
||||||
|
@ -583,7 +584,7 @@ static inline void hdlc_done(struct bc_state *bcs)
|
||||||
procskb->tail -= 2;
|
procskb->tail -= 2;
|
||||||
gig_dbg(DEBUG_ISO, "%s: good frame (%d octets)",
|
gig_dbg(DEBUG_ISO, "%s: good frame (%d octets)",
|
||||||
__func__, procskb->len);
|
__func__, procskb->len);
|
||||||
dump_bytes(DEBUG_STREAM,
|
dump_bytes(DEBUG_STREAM_DUMP,
|
||||||
"rcv data", procskb->data, procskb->len);
|
"rcv data", procskb->data, procskb->len);
|
||||||
bcs->hw.bas->goodbytes += procskb->len;
|
bcs->hw.bas->goodbytes += procskb->len;
|
||||||
gigaset_rcv_skb(procskb, bcs->cs, bcs);
|
gigaset_rcv_skb(procskb, bcs->cs, bcs);
|
||||||
|
@ -878,6 +879,8 @@ static inline void trans_receive(unsigned char *src, unsigned count,
|
||||||
dobytes--;
|
dobytes--;
|
||||||
}
|
}
|
||||||
if (dobytes == 0) {
|
if (dobytes == 0) {
|
||||||
|
dump_bytes(DEBUG_STREAM_DUMP,
|
||||||
|
"rcv data", skb->data, skb->len);
|
||||||
gigaset_rcv_skb(skb, bcs->cs, bcs);
|
gigaset_rcv_skb(skb, bcs->cs, bcs);
|
||||||
bcs->skb = skb = dev_alloc_skb(SBUFSIZE + HW_HDR_LEN);
|
bcs->skb = skb = dev_alloc_skb(SBUFSIZE + HW_HDR_LEN);
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
|
@ -973,16 +976,17 @@ void gigaset_isoc_input(struct inbuf_t *inbuf)
|
||||||
|
|
||||||
/* == data output ========================================================== */
|
/* == data output ========================================================== */
|
||||||
|
|
||||||
/* gigaset_send_skb
|
/**
|
||||||
* called by common.c to queue an skb for sending
|
* gigaset_isoc_send_skb() - queue an skb for sending
|
||||||
* and start transmission if necessary
|
* @bcs: B channel descriptor structure.
|
||||||
* parameters:
|
* @skb: data to send.
|
||||||
* B Channel control structure
|
*
|
||||||
* skb
|
* Called by i4l.c to queue an skb for sending, and start transmission if
|
||||||
* return value:
|
* necessary.
|
||||||
* number of bytes accepted for sending
|
*
|
||||||
* (skb->len if ok, 0 if out of buffer space)
|
* Return value:
|
||||||
* or error code (< 0, eg. -EINVAL)
|
* number of bytes accepted for sending (skb->len) if ok,
|
||||||
|
* error code < 0 (eg. -ENODEV) on error
|
||||||
*/
|
*/
|
||||||
int gigaset_isoc_send_skb(struct bc_state *bcs, struct sk_buff *skb)
|
int gigaset_isoc_send_skb(struct bc_state *bcs, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1129,7 +1129,6 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
|
||||||
spin_lock_bh(&adapter->mcc_lock);
|
spin_lock_bh(&adapter->mcc_lock);
|
||||||
|
|
||||||
wrb = wrb_from_mccq(adapter);
|
wrb = wrb_from_mccq(adapter);
|
||||||
req = embedded_payload(wrb);
|
|
||||||
sge = nonembedded_sgl(wrb);
|
sge = nonembedded_sgl(wrb);
|
||||||
|
|
||||||
be_wrb_hdr_prepare(wrb, cmd->size, false, 1);
|
be_wrb_hdr_prepare(wrb, cmd->size, false, 1);
|
||||||
|
|
|
@ -62,7 +62,7 @@ enum {
|
||||||
MCC_STATUS_QUEUE_FLUSHING = 0x4,
|
MCC_STATUS_QUEUE_FLUSHING = 0x4,
|
||||||
/* The command is completing with a DMA error */
|
/* The command is completing with a DMA error */
|
||||||
MCC_STATUS_DMA_FAILED = 0x5,
|
MCC_STATUS_DMA_FAILED = 0x5,
|
||||||
MCC_STATUS_NOT_SUPPORTED = 0x66
|
MCC_STATUS_NOT_SUPPORTED = 66
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
||||||
|
|
|
@ -363,7 +363,7 @@ const struct ethtool_ops be_ethtool_ops = {
|
||||||
.get_rx_csum = be_get_rx_csum,
|
.get_rx_csum = be_get_rx_csum,
|
||||||
.set_rx_csum = be_set_rx_csum,
|
.set_rx_csum = be_set_rx_csum,
|
||||||
.get_tx_csum = ethtool_op_get_tx_csum,
|
.get_tx_csum = ethtool_op_get_tx_csum,
|
||||||
.set_tx_csum = ethtool_op_set_tx_csum,
|
.set_tx_csum = ethtool_op_set_tx_hw_csum,
|
||||||
.get_sg = ethtool_op_get_sg,
|
.get_sg = ethtool_op_get_sg,
|
||||||
.set_sg = ethtool_op_set_sg,
|
.set_sg = ethtool_op_set_sg,
|
||||||
.get_tso = ethtool_op_get_tso,
|
.get_tso = ethtool_op_get_tso,
|
||||||
|
|
|
@ -197,7 +197,7 @@ void netdev_stats_update(struct be_adapter *adapter)
|
||||||
/* no space available in linux */
|
/* no space available in linux */
|
||||||
dev_stats->tx_dropped = 0;
|
dev_stats->tx_dropped = 0;
|
||||||
|
|
||||||
dev_stats->multicast = port_stats->tx_multicastframes;
|
dev_stats->multicast = port_stats->rx_multicast_frames;
|
||||||
dev_stats->collisions = 0;
|
dev_stats->collisions = 0;
|
||||||
|
|
||||||
/* detailed tx_errors */
|
/* detailed tx_errors */
|
||||||
|
@ -1899,8 +1899,8 @@ static void be_netdev_init(struct net_device *netdev)
|
||||||
struct be_adapter *adapter = netdev_priv(netdev);
|
struct be_adapter *adapter = netdev_priv(netdev);
|
||||||
|
|
||||||
netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
|
netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
|
||||||
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM |
|
NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_HW_CSUM |
|
||||||
NETIF_F_IPV6_CSUM | NETIF_F_GRO;
|
NETIF_F_GRO;
|
||||||
|
|
||||||
netdev->flags |= IFF_MULTICAST;
|
netdev->flags |= IFF_MULTICAST;
|
||||||
|
|
||||||
|
|
|
@ -1803,7 +1803,7 @@ struct e1000_info e1000_82574_info = {
|
||||||
| FLAG_HAS_AMT
|
| FLAG_HAS_AMT
|
||||||
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
||||||
.pba = 20,
|
.pba = 20,
|
||||||
.max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN,
|
.max_hw_frame_size = DEFAULT_JUMBO,
|
||||||
.get_variants = e1000_get_variants_82571,
|
.get_variants = e1000_get_variants_82571,
|
||||||
.mac_ops = &e82571_mac_ops,
|
.mac_ops = &e82571_mac_ops,
|
||||||
.phy_ops = &e82_phy_ops_bm,
|
.phy_ops = &e82_phy_ops_bm,
|
||||||
|
@ -1820,7 +1820,7 @@ struct e1000_info e1000_82583_info = {
|
||||||
| FLAG_HAS_AMT
|
| FLAG_HAS_AMT
|
||||||
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
||||||
.pba = 20,
|
.pba = 20,
|
||||||
.max_hw_frame_size = DEFAULT_JUMBO,
|
.max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN,
|
||||||
.get_variants = e1000_get_variants_82571,
|
.get_variants = e1000_get_variants_82571,
|
||||||
.mac_ops = &e82571_mac_ops,
|
.mac_ops = &e82571_mac_ops,
|
||||||
.phy_ops = &e82_phy_ops_bm,
|
.phy_ops = &e82_phy_ops_bm,
|
||||||
|
|
|
@ -330,6 +330,8 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
||||||
|
|
||||||
switch (hw->device_id) {
|
switch (hw->device_id) {
|
||||||
case IXGBE_DEV_ID_82599_KX4:
|
case IXGBE_DEV_ID_82599_KX4:
|
||||||
|
case IXGBE_DEV_ID_82599_KX4_MEZZ:
|
||||||
|
case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
|
||||||
case IXGBE_DEV_ID_82599_XAUI_LOM:
|
case IXGBE_DEV_ID_82599_XAUI_LOM:
|
||||||
/* Default device ID is mezzanine card KX/KX4 */
|
/* Default device ID is mezzanine card KX/KX4 */
|
||||||
media_type = ixgbe_media_type_backplane;
|
media_type = ixgbe_media_type_backplane;
|
||||||
|
|
|
@ -97,8 +97,12 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
|
||||||
board_82599 },
|
board_82599 },
|
||||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP),
|
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP),
|
||||||
board_82599 },
|
board_82599 },
|
||||||
|
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KX4_MEZZ),
|
||||||
|
board_82599 },
|
||||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4),
|
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4),
|
||||||
board_82599 },
|
board_82599 },
|
||||||
|
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_COMBO_BACKPLANE),
|
||||||
|
board_82599 },
|
||||||
|
|
||||||
/* required last entry */
|
/* required last entry */
|
||||||
{0, }
|
{0, }
|
||||||
|
|
|
@ -49,9 +49,11 @@
|
||||||
#define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1
|
#define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1
|
||||||
#define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4
|
#define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4
|
||||||
#define IXGBE_DEV_ID_82599_KX4 0x10F7
|
#define IXGBE_DEV_ID_82599_KX4 0x10F7
|
||||||
|
#define IXGBE_DEV_ID_82599_KX4_MEZZ 0x1514
|
||||||
#define IXGBE_DEV_ID_82599_CX4 0x10F9
|
#define IXGBE_DEV_ID_82599_CX4 0x10F9
|
||||||
#define IXGBE_DEV_ID_82599_SFP 0x10FB
|
#define IXGBE_DEV_ID_82599_SFP 0x10FB
|
||||||
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
|
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
|
||||||
|
#define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8
|
||||||
|
|
||||||
/* General Registers */
|
/* General Registers */
|
||||||
#define IXGBE_CTRL 0x00000
|
#define IXGBE_CTRL 0x00000
|
||||||
|
|
|
@ -1754,14 +1754,14 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
||||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
|
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
|
||||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
|
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
|
||||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
|
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
|
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
|
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"),
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"),
|
PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b),
|
PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b),
|
||||||
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
|
PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
|
||||||
0xb4be14e3, 0x43ac239b, 0x0877b627),
|
0xb4be14e3, 0x43ac239b, 0x0877b627),
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
|
#include <linux/rtnetlink.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* General definitions...
|
* General definitions...
|
||||||
|
@ -135,9 +136,9 @@ enum {
|
||||||
RST_FO_TFO = (1 << 0),
|
RST_FO_TFO = (1 << 0),
|
||||||
RST_FO_RR_MASK = 0x00060000,
|
RST_FO_RR_MASK = 0x00060000,
|
||||||
RST_FO_RR_CQ_CAM = 0x00000000,
|
RST_FO_RR_CQ_CAM = 0x00000000,
|
||||||
RST_FO_RR_DROP = 0x00000001,
|
RST_FO_RR_DROP = 0x00000002,
|
||||||
RST_FO_RR_DQ = 0x00000002,
|
RST_FO_RR_DQ = 0x00000004,
|
||||||
RST_FO_RR_RCV_FUNC_CQ = 0x00000003,
|
RST_FO_RR_RCV_FUNC_CQ = 0x00000006,
|
||||||
RST_FO_FRB = (1 << 12),
|
RST_FO_FRB = (1 << 12),
|
||||||
RST_FO_MOP = (1 << 13),
|
RST_FO_MOP = (1 << 13),
|
||||||
RST_FO_REG = (1 << 14),
|
RST_FO_REG = (1 << 14),
|
||||||
|
@ -1477,7 +1478,6 @@ struct ql_adapter {
|
||||||
u32 mailbox_in;
|
u32 mailbox_in;
|
||||||
u32 mailbox_out;
|
u32 mailbox_out;
|
||||||
struct mbox_params idc_mbc;
|
struct mbox_params idc_mbc;
|
||||||
struct mutex mpi_mutex;
|
|
||||||
|
|
||||||
int tx_ring_size;
|
int tx_ring_size;
|
||||||
int rx_ring_size;
|
int rx_ring_size;
|
||||||
|
|
|
@ -45,7 +45,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
|
||||||
if (!netif_running(qdev->ndev))
|
if (!netif_running(qdev->ndev))
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
spin_lock(&qdev->hw_lock);
|
|
||||||
/* Skip the default queue, and update the outbound handler
|
/* Skip the default queue, and update the outbound handler
|
||||||
* queues if they changed.
|
* queues if they changed.
|
||||||
*/
|
*/
|
||||||
|
@ -92,7 +91,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
spin_unlock(&qdev->hw_lock);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <linux/ethtool.h>
|
#include <linux/ethtool.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/rtnetlink.h>
|
|
||||||
#include <linux/if_vlan.h>
|
#include <linux/if_vlan.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@ -1926,12 +1925,10 @@ static void ql_vlan_rx_add_vid(struct net_device *ndev, u16 vid)
|
||||||
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
|
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
|
||||||
if (status)
|
if (status)
|
||||||
return;
|
return;
|
||||||
spin_lock(&qdev->hw_lock);
|
|
||||||
if (ql_set_mac_addr_reg
|
if (ql_set_mac_addr_reg
|
||||||
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
|
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
|
||||||
QPRINTK(qdev, IFUP, ERR, "Failed to init vlan address.\n");
|
QPRINTK(qdev, IFUP, ERR, "Failed to init vlan address.\n");
|
||||||
}
|
}
|
||||||
spin_unlock(&qdev->hw_lock);
|
|
||||||
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1945,12 +1942,10 @@ static void ql_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)
|
||||||
if (status)
|
if (status)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
spin_lock(&qdev->hw_lock);
|
|
||||||
if (ql_set_mac_addr_reg
|
if (ql_set_mac_addr_reg
|
||||||
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
|
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
|
||||||
QPRINTK(qdev, IFUP, ERR, "Failed to clear vlan address.\n");
|
QPRINTK(qdev, IFUP, ERR, "Failed to clear vlan address.\n");
|
||||||
}
|
}
|
||||||
spin_unlock(&qdev->hw_lock);
|
|
||||||
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2001,15 +1996,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
|
||||||
/*
|
/*
|
||||||
* Check MPI processor activity.
|
* Check MPI processor activity.
|
||||||
*/
|
*/
|
||||||
if (var & STS_PI) {
|
if ((var & STS_PI) &&
|
||||||
|
(ql_read32(qdev, INTR_MASK) & INTR_MASK_PI)) {
|
||||||
/*
|
/*
|
||||||
* We've got an async event or mailbox completion.
|
* We've got an async event or mailbox completion.
|
||||||
* Handle it and clear the source of the interrupt.
|
* Handle it and clear the source of the interrupt.
|
||||||
*/
|
*/
|
||||||
QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n");
|
QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n");
|
||||||
ql_disable_completion_interrupt(qdev, intr_context->intr);
|
ql_disable_completion_interrupt(qdev, intr_context->intr);
|
||||||
queue_delayed_work_on(smp_processor_id(), qdev->workqueue,
|
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
||||||
&qdev->mpi_work, 0);
|
queue_delayed_work_on(smp_processor_id(),
|
||||||
|
qdev->workqueue, &qdev->mpi_work, 0);
|
||||||
work_done++;
|
work_done++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3585,7 +3582,6 @@ static void qlge_set_multicast_list(struct net_device *ndev)
|
||||||
status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
|
status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
|
||||||
if (status)
|
if (status)
|
||||||
return;
|
return;
|
||||||
spin_lock(&qdev->hw_lock);
|
|
||||||
/*
|
/*
|
||||||
* Set or clear promiscuous mode if a
|
* Set or clear promiscuous mode if a
|
||||||
* transition is taking place.
|
* transition is taking place.
|
||||||
|
@ -3662,7 +3658,6 @@ static void qlge_set_multicast_list(struct net_device *ndev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
spin_unlock(&qdev->hw_lock);
|
|
||||||
ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
|
ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3682,10 +3677,8 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p)
|
||||||
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
|
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
spin_lock(&qdev->hw_lock);
|
|
||||||
status = ql_set_mac_addr_reg(qdev, (u8 *) ndev->dev_addr,
|
status = ql_set_mac_addr_reg(qdev, (u8 *) ndev->dev_addr,
|
||||||
MAC_ADDR_TYPE_CAM_MAC, qdev->func * MAX_CQ);
|
MAC_ADDR_TYPE_CAM_MAC, qdev->func * MAX_CQ);
|
||||||
spin_unlock(&qdev->hw_lock);
|
|
||||||
if (status)
|
if (status)
|
||||||
QPRINTK(qdev, HW, ERR, "Failed to load MAC address.\n");
|
QPRINTK(qdev, HW, ERR, "Failed to load MAC address.\n");
|
||||||
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
|
||||||
|
@ -3928,7 +3921,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
|
||||||
INIT_DELAYED_WORK(&qdev->mpi_work, ql_mpi_work);
|
INIT_DELAYED_WORK(&qdev->mpi_work, ql_mpi_work);
|
||||||
INIT_DELAYED_WORK(&qdev->mpi_port_cfg_work, ql_mpi_port_cfg_work);
|
INIT_DELAYED_WORK(&qdev->mpi_port_cfg_work, ql_mpi_port_cfg_work);
|
||||||
INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work);
|
INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work);
|
||||||
mutex_init(&qdev->mpi_mutex);
|
|
||||||
init_completion(&qdev->ide_completion);
|
init_completion(&qdev->ide_completion);
|
||||||
|
|
||||||
if (!cards_found) {
|
if (!cards_found) {
|
||||||
|
|
|
@ -472,7 +472,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
||||||
{
|
{
|
||||||
int status, count;
|
int status, count;
|
||||||
|
|
||||||
mutex_lock(&qdev->mpi_mutex);
|
|
||||||
|
|
||||||
/* Begin polled mode for MPI */
|
/* Begin polled mode for MPI */
|
||||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
||||||
|
@ -541,7 +540,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
|
||||||
status = -EIO;
|
status = -EIO;
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
mutex_unlock(&qdev->mpi_mutex);
|
|
||||||
/* End polled mode for MPI */
|
/* End polled mode for MPI */
|
||||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
|
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
|
||||||
return status;
|
return status;
|
||||||
|
@ -776,7 +774,9 @@ static int ql_idc_wait(struct ql_adapter *qdev)
|
||||||
static int ql_set_port_cfg(struct ql_adapter *qdev)
|
static int ql_set_port_cfg(struct ql_adapter *qdev)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
rtnl_lock();
|
||||||
status = ql_mb_set_port_cfg(qdev);
|
status = ql_mb_set_port_cfg(qdev);
|
||||||
|
rtnl_unlock();
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
status = ql_idc_wait(qdev);
|
status = ql_idc_wait(qdev);
|
||||||
|
@ -797,7 +797,9 @@ void ql_mpi_port_cfg_work(struct work_struct *work)
|
||||||
container_of(work, struct ql_adapter, mpi_port_cfg_work.work);
|
container_of(work, struct ql_adapter, mpi_port_cfg_work.work);
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
rtnl_lock();
|
||||||
status = ql_mb_get_port_cfg(qdev);
|
status = ql_mb_get_port_cfg(qdev);
|
||||||
|
rtnl_unlock();
|
||||||
if (status) {
|
if (status) {
|
||||||
QPRINTK(qdev, DRV, ERR,
|
QPRINTK(qdev, DRV, ERR,
|
||||||
"Bug: Failed to get port config data.\n");
|
"Bug: Failed to get port config data.\n");
|
||||||
|
@ -855,7 +857,9 @@ void ql_mpi_idc_work(struct work_struct *work)
|
||||||
* needs to be set.
|
* needs to be set.
|
||||||
* */
|
* */
|
||||||
set_bit(QL_CAM_RT_SET, &qdev->flags);
|
set_bit(QL_CAM_RT_SET, &qdev->flags);
|
||||||
|
rtnl_lock();
|
||||||
status = ql_mb_idc_ack(qdev);
|
status = ql_mb_idc_ack(qdev);
|
||||||
|
rtnl_unlock();
|
||||||
if (status) {
|
if (status) {
|
||||||
QPRINTK(qdev, DRV, ERR,
|
QPRINTK(qdev, DRV, ERR,
|
||||||
"Bug: No pending IDC!\n");
|
"Bug: No pending IDC!\n");
|
||||||
|
@ -871,7 +875,7 @@ void ql_mpi_work(struct work_struct *work)
|
||||||
struct mbox_params *mbcp = &mbc;
|
struct mbox_params *mbcp = &mbc;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
mutex_lock(&qdev->mpi_mutex);
|
rtnl_lock();
|
||||||
|
|
||||||
while (ql_read32(qdev, STS) & STS_PI) {
|
while (ql_read32(qdev, STS) & STS_PI) {
|
||||||
memset(mbcp, 0, sizeof(struct mbox_params));
|
memset(mbcp, 0, sizeof(struct mbox_params));
|
||||||
|
@ -884,7 +888,7 @@ void ql_mpi_work(struct work_struct *work)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&qdev->mpi_mutex);
|
rtnl_unlock();
|
||||||
ql_enable_completion_interrupt(qdev, 0);
|
ql_enable_completion_interrupt(qdev, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -873,10 +873,10 @@ static struct pcmcia_device_id serial_ids[] = {
|
||||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
|
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
|
||||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
|
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
|
||||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
|
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
|
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
|
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "DP83903.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"),
|
||||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
|
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */
|
PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */
|
||||||
|
@ -884,9 +884,9 @@ static struct pcmcia_device_id serial_ids[] = {
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
|
PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
|
PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "COMpad2.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
|
||||||
PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
|
PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
|
||||||
PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"),
|
PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"),
|
||||||
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b),
|
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b),
|
||||||
|
|
|
@ -67,10 +67,13 @@ fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin
|
||||||
fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \
|
fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \
|
||||||
e100/d102e_ucode.bin
|
e100/d102e_ucode.bin
|
||||||
fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
|
fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
|
||||||
fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis
|
fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \
|
||||||
|
cis/DP83903.cis cis/NE2K.cis \
|
||||||
|
cis/tamarack.cis
|
||||||
fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis
|
fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis
|
||||||
fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis
|
fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis
|
||||||
fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis
|
fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \
|
||||||
|
cis/COMpad2.cis cis/COMpad4.cis
|
||||||
fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
|
fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
|
||||||
fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
|
fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
|
||||||
advansys/3550.bin advansys/38C0800.bin
|
advansys/3550.bin advansys/38C0800.bin
|
||||||
|
|
|
@ -597,6 +597,9 @@ Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter
|
||||||
|
|
||||||
File: cis/LA-PCM.cis
|
File: cis/LA-PCM.cis
|
||||||
cis/PCMLM28.cis
|
cis/PCMLM28.cis
|
||||||
|
cis/DP83903.cis
|
||||||
|
cis/NE2K.cis
|
||||||
|
cis/tamarack.cis
|
||||||
|
|
||||||
Licence: GPL
|
Licence: GPL
|
||||||
|
|
||||||
|
@ -628,6 +631,8 @@ Driver: SERIAL_8250_CS - Serial PCMCIA adapter
|
||||||
|
|
||||||
File: cis/MT5634ZLX.cis
|
File: cis/MT5634ZLX.cis
|
||||||
cis/RS-COM-2P.cis
|
cis/RS-COM-2P.cis
|
||||||
|
cis/COMpad2.cis
|
||||||
|
cis/COMpad4.cis
|
||||||
|
|
||||||
Licence: GPL
|
Licence: GPL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
:1000000001030000FF151F0401414456414E5445B1
|
||||||
|
:10001000434800434F4D7061642D33322F38350013
|
||||||
|
:10002000312E300000FF210202011A0501050001F6
|
||||||
|
:10003000031B0EC18118AA61E80207E8030730B864
|
||||||
|
:100040009E1B08820108AA6030030F1B0883010869
|
||||||
|
:10005000AA6040030F1B08840108AA6050030F1B0D
|
||||||
|
:0D00600008850108AA6060030F1400FF006E
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for Advantech COMpad-32/85
|
||||||
|
#
|
|
@ -0,0 +1,9 @@
|
||||||
|
:1000000001030000FF151F0401414456414E5445B1
|
||||||
|
:10001000434800434F4D7061642D33322F383542D1
|
||||||
|
:100020002D34000000FF210202011A050102000127
|
||||||
|
:10003000011B0BC18118AA6040021F30B89E1B082B
|
||||||
|
:0C004000820108AA6040031F1400FF00AA
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for Advantech COMpad-32/85B-4
|
||||||
|
#
|
|
@ -0,0 +1,14 @@
|
||||||
|
:1000000001030000FF152904014D756C74696675C4
|
||||||
|
:100010006E6374696F6E20436172640000004E531A
|
||||||
|
:1000200043204D46204C414E2F4D6F64656D00FFBF
|
||||||
|
:1000300020047501000021020000060B02004900A7
|
||||||
|
:100040000000006A000000FF00130343495321022F
|
||||||
|
:1000500006001A060517201077021B0C970179017C
|
||||||
|
:10006000556530FFFF284000FF001303434953212B
|
||||||
|
:100070000202001A060507401077021B09870119C2
|
||||||
|
:0800800001552330FFFFFF00D2
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# This CIS is for cards based on the National Semiconductor
|
||||||
|
# DP83903 Multiple Function Interface Chip
|
||||||
|
#
|
|
@ -0,0 +1,8 @@
|
||||||
|
:1000000001030000FF1515040150434D4349410011
|
||||||
|
:1000100045746865726E6574000000FF2102060079
|
||||||
|
:100020001A050120F803031B09E001190155653089
|
||||||
|
:06003000FFFF1400FF00B9
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for various busted NE2000-compatible cards
|
||||||
|
#
|
|
@ -0,0 +1,10 @@
|
||||||
|
:100000000103D400FF17034100FF152404015441EC
|
||||||
|
:100010004D415241434B0045746865726E657400F2
|
||||||
|
:10002000410030303437343331313830303100FF33
|
||||||
|
:10003000210206001A050120F803031B14E08119B0
|
||||||
|
:100040003F554D5D06864626E551000F100F30FFE7
|
||||||
|
:05005000FF1400FF0099
|
||||||
|
:00000001FF
|
||||||
|
#
|
||||||
|
# Replacement CIS for Surecom, Tamarack NE2000 cards
|
||||||
|
#
|
|
@ -16,7 +16,7 @@ struct __kernel_sockaddr_storage {
|
||||||
/* _SS_MAXSIZE value minus size of ss_family */
|
/* _SS_MAXSIZE value minus size of ss_family */
|
||||||
} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */
|
} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */
|
||||||
|
|
||||||
#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#include <asm/socket.h> /* arch-dependent defines */
|
#include <asm/socket.h> /* arch-dependent defines */
|
||||||
#include <linux/sockios.h> /* the SIOCxxx I/O controls */
|
#include <linux/sockios.h> /* the SIOCxxx I/O controls */
|
||||||
|
@ -100,21 +100,6 @@ struct cmsghdr {
|
||||||
((mhdr)->msg_controllen - \
|
((mhdr)->msg_controllen - \
|
||||||
((char *)(cmsg) - (char *)(mhdr)->msg_control)))
|
((char *)(cmsg) - (char *)(mhdr)->msg_control)))
|
||||||
|
|
||||||
/*
|
|
||||||
* This mess will go away with glibc
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
#define __KINLINE static inline
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
#define __KINLINE static __inline__
|
|
||||||
#elif defined(__cplusplus)
|
|
||||||
#define __KINLINE static inline
|
|
||||||
#else
|
|
||||||
#define __KINLINE static
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the next cmsg header
|
* Get the next cmsg header
|
||||||
*
|
*
|
||||||
|
@ -128,7 +113,7 @@ struct cmsghdr {
|
||||||
* ancillary object DATA. --ANK (980731)
|
* ancillary object DATA. --ANK (980731)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
__KINLINE struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
|
static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
|
||||||
struct cmsghdr *__cmsg)
|
struct cmsghdr *__cmsg)
|
||||||
{
|
{
|
||||||
struct cmsghdr * __ptr;
|
struct cmsghdr * __ptr;
|
||||||
|
@ -140,7 +125,7 @@ __KINLINE struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
|
||||||
return __ptr;
|
return __ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
__KINLINE struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
|
static inline struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
|
||||||
{
|
{
|
||||||
return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
|
return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -406,13 +406,13 @@ static ssize_t wireless_show(struct device *d, char *buf,
|
||||||
const struct iw_statistics *iw;
|
const struct iw_statistics *iw;
|
||||||
ssize_t ret = -EINVAL;
|
ssize_t ret = -EINVAL;
|
||||||
|
|
||||||
read_lock(&dev_base_lock);
|
rtnl_lock();
|
||||||
if (dev_isalive(dev)) {
|
if (dev_isalive(dev)) {
|
||||||
iw = get_wireless_stats(dev);
|
iw = get_wireless_stats(dev);
|
||||||
if (iw)
|
if (iw)
|
||||||
ret = (*format)(iw, buf);
|
ret = (*format)(iw, buf);
|
||||||
}
|
}
|
||||||
read_unlock(&dev_base_lock);
|
rtnl_unlock();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -964,7 +964,7 @@ static ssize_t pktgen_if_write(struct file *file,
|
||||||
if (value == 0x7FFFFFFF)
|
if (value == 0x7FFFFFFF)
|
||||||
pkt_dev->delay = ULLONG_MAX;
|
pkt_dev->delay = ULLONG_MAX;
|
||||||
else
|
else
|
||||||
pkt_dev->delay = (u64)value * NSEC_PER_USEC;
|
pkt_dev->delay = (u64)value;
|
||||||
|
|
||||||
sprintf(pg_result, "OK: delay=%llu",
|
sprintf(pg_result, "OK: delay=%llu",
|
||||||
(unsigned long long) pkt_dev->delay);
|
(unsigned long long) pkt_dev->delay);
|
||||||
|
@ -2212,7 +2212,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev)
|
||||||
if (pkt_dev->flags & F_QUEUE_MAP_CPU)
|
if (pkt_dev->flags & F_QUEUE_MAP_CPU)
|
||||||
pkt_dev->cur_queue_map = smp_processor_id();
|
pkt_dev->cur_queue_map = smp_processor_id();
|
||||||
|
|
||||||
else if (pkt_dev->queue_map_min < pkt_dev->queue_map_max) {
|
else if (pkt_dev->queue_map_min <= pkt_dev->queue_map_max) {
|
||||||
__u16 t;
|
__u16 t;
|
||||||
if (pkt_dev->flags & F_QUEUE_MAP_RND) {
|
if (pkt_dev->flags & F_QUEUE_MAP_RND) {
|
||||||
t = random32() %
|
t = random32() %
|
||||||
|
|
Загрузка…
Ссылка в новой задаче