blob: 6d2682b1e2b927f4b0716ca493054f2afbc976d8 [file] [log] [blame]
/*
* Copyright (c) 2016 MediaTek Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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.
*/
#ifndef __BTMTK_USB_MAIN_H__
#define __BTMTK_USB_MAIN_H__
#include <net/bluetooth/bluetooth.h>
#include "btmtk_define.h"
/* Please keep sync with btmtk_usb_set_state function */
enum {
BTMTK_USB_STATE_UNKNOWN,
BTMTK_USB_STATE_INIT,
BTMTK_USB_STATE_DISCONNECT,
BTMTK_USB_STATE_PROBE,
BTMTK_USB_STATE_WORKING,
BTMTK_USB_STATE_EARLY_SUSPEND,
BTMTK_USB_STATE_SUSPEND,
BTMTK_USB_STATE_RESUME,
BTMTK_USB_STATE_LATE_RESUME,
BTMTK_USB_STATE_FW_DUMP,
BTMTK_USB_STATE_SUSPEND_DISCONNECT,
BTMTK_USB_STATE_SUSPEND_PROBE,
BTMTK_USB_STATE_RESUME_DISCONNECT,
BTMTK_USB_STATE_RESUME_PROBE,
BTMTK_USB_STATE_RESUME_FW_DUMP,
};
/* Please keep sync with btmtk_fops_set_state function */
enum {
BTMTK_FOPS_STATE_UNKNOWN, /* deinit in stpbt destroy */
BTMTK_FOPS_STATE_INIT, /* init in stpbt created */
BTMTK_FOPS_STATE_OPENED, /* open in fops_open */
BTMTK_FOPS_STATE_CLOSING, /* during closing */
BTMTK_FOPS_STATE_CLOSED, /* closed */
};
struct OSAL_UNSLEEPABLE_LOCK {
spinlock_t lock;
unsigned long flag;
};
struct ring_buffer_struct {
struct OSAL_UNSLEEPABLE_LOCK spin_lock;
unsigned char buffer[META_BUFFER_SIZE]; /* MTKSTP_BUFFER_SIZE:1024 */
unsigned int read_p; /* indicate the current read index */
unsigned int write_p; /* indicate the current write index */
};
struct btmtk_usb_data {
struct usb_device *udev; /* store the usb device informaiton */
struct usb_interface *intf; /* current interface */
struct usb_interface *isoc; /* isochronous interface */
struct work_struct waker;
struct semaphore wr_mtx;
struct semaphore rd_mtx;
struct usb_anchor tx_anchor;
struct usb_anchor intr_anchor;
struct usb_anchor bulk_anchor;
int meta_tx;
spinlock_t txlock;
/* USB endpoint */
struct usb_endpoint_descriptor *intr_ep;
struct usb_endpoint_descriptor *bulk_tx_ep;
struct usb_endpoint_descriptor *bulk_rx_ep;
int suspend_count;
/* request for different io operation */
unsigned char w_request;
unsigned char r_request;
/* io buffer for usb control transfer */
unsigned char *io_buf;
unsigned char *rom_patch;
unsigned char *rom_patch_bin_file_name;
unsigned char *rom_patch_image;
unsigned int rom_patch_image_len;
unsigned int chip_id;
unsigned int rom_patch_offset;
unsigned int rom_patch_len;
unsigned char *i_buf;
unsigned char *o_buf;
struct ring_buffer_struct *metabuffer;
unsigned char interrupt_urb_submitted;
unsigned char bulk_urb_submitted;
void *bt_fifo;
#if SUPPORT_MT7668
unsigned char is_mt7668_dongle_state;
#endif
struct sk_buff_head fwlog_queue;
spinlock_t fwlog_lock;
u32 fwlog_queue_count;
};
/**
* Inline functions
*/
#if SUPPORT_MT7662
static inline int is_mt7662(struct btmtk_usb_data *data)
{
/** Return 1, if MT76x2 or MT76x2T */
return ((data->chip_id & 0xffff0000) == 0x76620000)
|| ((data->chip_id & 0xffff0000) == 0x76320000);
}
static inline int is_mt7662T(struct btmtk_usb_data *data)
{
/** Return 1, if MT76x2T */
return ((data->chip_id & 0xffffffff) == 0x76620100)
|| ((data->chip_id & 0xffffffff) == 0x76320100);
}
#endif
#if SUPPORT_MT7668
static inline int is_mt7668(struct btmtk_usb_data *data)
{
return ((data->chip_id & 0xffff) == 0x7668);
}
enum {
BTMTK_USB_7668_DONGLE_STATE_UNKNOWN,
BTMTK_USB_7668_DONGLE_STATE_POWERING_ON,
BTMTK_USB_7668_DONGLE_STATE_POWER_ON,
BTMTK_USB_7668_DONGLE_STATE_WOBLE,
BTMTK_USB_7668_DONGLE_STATE_POWERING_OFF,
BTMTK_USB_7668_DONGLE_STATE_POWER_OFF,
BTMTK_USB_7668_DONGLE_STATE_ERROR
};
#endif
/**
* Extern functions
*/
int btmtk_usb_send_data(const unsigned char *buffer, const unsigned int length);
int btmtk_usb_meta_send_data(const unsigned char *buffer,
const unsigned int length);
void btmtk_usb_toggle_rst_pin(void);
#endif /* __BTMTK_USB_MAIN_H__ */