blob: e7553f76093e11d0f65051840df01d8a59242580 [file] [log] [blame]
/*
* baseband_usb_chr.h
*
* USB character driver to communicate with baseband modems.
*
* Copyright (c) 2011, NVIDIA Corporation.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef __BASEBAND_USB_CHR_H__
#define __BASEBAND_USB_CHR_H__
#define BASEBAND_USB_CHR_DEV_NAME "baseband_usb_chr"
#define BASEBAND_USB_CHR_DEV_MAJOR 66
#ifndef USB_CHR_RX_BUFSIZ
#define USB_CHR_RX_BUFSIZ (32*1024)
#endif /* USB_CHR_RX_BUFSIZ */
#ifndef USB_CHR_TX_BUFSIZ
#define USB_CHR_TX_BUFSIZ (32*1024)
#endif /* USB_CHR_TX_BUFSIZ */
#ifndef USB_CHR_TIMEOUT
#define USB_CHR_TIMEOUT 5000 /* ms */
#endif /* USB_CHR_TIMEOUT */
#ifndef BASEBAND_IPC_NUM_RX_BUF
#define BASEBAND_IPC_NUM_RX_BUF 1
#endif /* BASEBAND_IPC_NUM_RX_BUF */
#ifndef BASEBAND_IPC_NUM_TX_BUF
#define BASEBAND_IPC_NUM_TX_BUF 1
#endif /* BASEBAND_IPC_NUM_TX_BUF */
#ifndef BASEBAND_IPC_BUFSIZ
#define BASEBAND_IPC_BUFSIZ 65536
#endif /* BASEBAND_IPC_BUFSIZ */
struct baseband_ipc {
/* rx / tx data */
struct semaphore buf_sem;
struct {
/* linked list of data buffers */
struct list_head buf;
/* wait queue of processes trying to access data buffers */
wait_queue_head_t wait;
} rx, tx, rx_free, tx_free;
unsigned char *ipc_rx;
unsigned char *ipc_tx;
/* work queue
* - queued per ipc transaction
* - initiated by either:
* = interrupt on gpio line (rx data available)
* = tx data packet being added to tx linked list
*/
struct workqueue_struct *workqueue;
struct work_struct work;
struct work_struct rx_work;
struct work_struct tx_work;
};
struct baseband_ipc_buf {
struct list_head list;
/* data buffer */
unsigned char data[BASEBAND_IPC_BUFSIZ];
/* offset of first data byte */
size_t offset;
/* number of valid data bytes */
size_t count;
};
struct baseband_usb {
struct baseband_ipc *ipc;
unsigned int ref;
struct {
struct usb_driver *driver;
struct usb_device *device;
struct usb_interface *interface;
struct {
struct {
unsigned int in;
unsigned int out;
} isoch, bulk, interrupt;
} pipe;
/* currently active rx urb */
struct urb *rx_urb;
/* currently active tx urb */
struct urb *tx_urb;
} usb;
};
#endif /* __BASEBAND_USB_CHR_H__ */