199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park/*
299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park * Copyright 2012 The Android Open Source Project
399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park * Copyright (c) 2013, The Linux Foundation. All rights reserved.
499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park * Not a Contribution.
599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *
699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  Licensed under the Apache License, Version 2.0 (the "License");
799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  you may not use this file except in compliance with the License.
899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park * You may obtain a copy of the License at
999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *
1099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  http://www.apache.org/licenses/LICENSE-2.0
1199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *
1299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  Unless required by applicable law or agreed to in writing, software
1399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  distributed under the License is distributed on an "AS IS" BASIS,
1499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  See the License for the specific language governing permissions and
1699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park *  limitations under the License.
1799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park */
1899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#ifndef HW_AR3K_H
1999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HW_AR3K_H
2099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
2199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park/******************************************************************************
2299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park**  Constants & Macros
2399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park******************************************************************************/
2499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define MAX_CNT_RETRY 100
2599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
2699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_MAX_CMD_SIZE   260
2799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_MAX_EVENT_SIZE  260
2899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_CHG_BAUD_CMD_OCF 0x0C
2999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_VENDOR_CMD_OGF 0x3F
3099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define WRITE_BDADDR_CMD_LEN 14
3199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define WRITE_BAUD_CMD_LEN   6
3299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN
3399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define GET_VERSION_OCF 0x1E
3499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park/* Byte order conversions */
3599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#if __BYTE_ORDER == __LITTLE_ENDIAN
3699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define htobs(d)  (d)
3799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define htobl(d)  (d)
3899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define btohs(d)  (d)
3999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define btohl(d)  (d)
4099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#elif __BYTE_ORDER == __BIG_ENDIAN
4199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define htobs(d)  bswap_16(d)
4299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define htobl(d)  bswap_32(d)
4399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define btohs(d)  bswap_16(d)
4499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define btohl(d)  bswap_32(d)
4599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#else
4699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#error "Unknown byte order"
4799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#endif
4899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
4999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define FW_PATH "/system/etc/firmware/ar3k/"
5099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
5199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define STREAM_TO_UINT16(u16, p) \
5299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;}
5399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define UINT16_TO_STREAM(p, u16) \
5499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);}
5599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define UINT32_TO_STREAM(p, u32) \
5699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8);\
5799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);}
5899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
5999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define MAX_TAGS              50
6099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PS_HDR_LEN            4
6199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_VENDOR_CMD_OGF    0x3F
6299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_PS_CMD_OCF        0x0B
6399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
6499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define VERIFY_CRC   9
6599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PS_REGION    1
6699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PATCH_REGION 2
6799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define BDADDR_FILE "ar3kbdaddr.pst"
6899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
6999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
7099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define MAX_PATCH_CMD 244
7199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Parkstruct patch_entry {
7299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int16_t len;
7399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    uint8_t data[MAX_PATCH_CMD];
7499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park};
7599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_UART_RAW_DEVICE    0
7699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_COMMAND_HDR_SIZE 3
7799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PS_WRITE           1
7899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PS_RESET           2
7999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define WRITE_PATCH        8
8099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define ENABLE_PATCH       11
8199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
8299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_PS_CMD_HDR_LEN 7
8399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_CMD_MAX_LEN             258
8499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PS_RESET_PARAM_LEN 6
8599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PS_RESET_CMD_LEN   (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN)
8699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
8799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define PS_ID_MASK         0xFF
8899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
8999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
9099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define LOCAL_NAME_BUFFER_LEN                   32
9199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define DEV_REGISTER      0x4FFC
9299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define GET_DEV_TYPE_OCF  0x05
9399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
9499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCIDEVUP            _IOW('H', 201, int)
9599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define OGF_VENDOR_CMD                  0x3f
9699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define EVT_CMD_COMPLETE_SIZE     3
9799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define EVT_CMD_STATUS                   0x0F
9899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define EVT_CMD_STATUS_SIZE         4
9999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_COMMAND_HDR_SIZE      3
10099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_EVENT_HDR_SIZE            2
10199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_EV_SUCCESS                    0x00
10299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park/* HCI Socket options */
10399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_DATA_DIR        1
10499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_FILTER              2
10599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_TIME_STAMP    3
10699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
10799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park/* HCI CMSG flags */
10899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_CMSG_DIR            0x0001
10999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define HCI_CMSG_TSTAMP     0x0002
11099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
11199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#ifndef VENDOR_LPM_PROC_NODE
11299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define VENDOR_LPM_PROC_NODE "/sys/module/hci_uart/parameters/ath_lpm"
11399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#endif
11499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
11599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park/* proc fs node for notifying write request */
11699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#ifndef VENDOR_BTWRITE_PROC_NODE
11799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#define VENDOR_BTWRITE_PROC_NODE "/sys/module/hci_uart/parameters/ath_btwrite"
11899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#endif
11999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
12099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park/******************************************************************************
12199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park**  Local type definitions
12299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park******************************************************************************/
12399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Parktypedef struct {
12499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    uint8_t b[6];
12599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park} __attribute__((packed)) bdaddr_t;
12699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
12799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Parkstruct sockaddr_hci {
12899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    sa_family_t hci_family;
12999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned short  hci_dev;
13099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned short  hci_channel;
13199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park};
13299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
13399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Parkstruct tag_info {
13499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned section;
13599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned line_count;
13699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned char_cnt;
13799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned byte_count;
13899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park};
13999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
14099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Parkstruct ps_cfg_entry {
14199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    uint32_t id;
14299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    uint32_t len;
14399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    uint8_t *data;
14499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park};
14599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
14699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Parkstruct ps_entry_type {
14799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned char type;
14899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    unsigned char array;
14999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park};
15099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park
15199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Parkstruct uart_t {
15299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    char *type;
15399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  m_id;
15499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  p_id;
15599bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  proto;
15699bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  init_speed;
15799bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  speed;
15899bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  flags;
15999bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  pm;
16099bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    char *bdaddr;
16199bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  (*init) (int fd, struct uart_t *u, struct termios *ti);
16299bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park    int  (*post) (int fd, struct uart_t *u, struct termios *ti);
16399bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park};
16499bfc35243bc810e59ef0c0f39bd79eb59030ab2Ecco Park#endif /* HW_AR3K_H */
165