/* * 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__ */