1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef USB_INTERFACE_POOL_H
17#define USB_INTERFACE_POOL_H
18
19#include "usb_session.h"
20#include "usb_ddk_device.h"
21#include "usb_ddk_interface.h"
22#include "usb_ddk_request.h"
23#include "usb_raw_api_library.h"
24
25#define INTERFACE_POOL_ID_MAX   (128)
26#define INTERFACE_REFCOUNT_UNFORCE  (1)
27
28typedef enum {
29    USB_PIPE_INDEX_TYPE,
30    USB_PIPE_DIRECTION_TYPE
31} UsbPipeQueryParaType;
32
33typedef enum {
34    USB_INTERFACE_INTERFACE_INDEX_TYPE,
35    USB_INTERFACE_ALT_SETTINGS_TYPE
36} UsbInterfaceQueryParaType;
37
38typedef enum {
39    USB_POOL_NORMAL_TYPE,
40    USB_POOL_OBJECT_ID_TYPE
41} UsbPoolQueryParaType;
42
43typedef enum {
44    USB_POOL_PROCESS_RUNNING,
45    USB_POOL_PROCESS_STOP,
46    USB_POOL_PROCESS_STOPED
47} UsbPoolProcessStatusType;
48
49struct UsbInterfaceHandleEntity {
50    struct UsbDeviceHandle *devHandle;
51    uint8_t interfaceIndex;
52};
53struct UsbSdkInterface {
54    struct UsbInterface interface;
55    int32_t parentObjectId;
56    struct DListHead pipeList;
57    struct OsalMutex listLock;
58    UsbInterfaceStatus status;
59    uint8_t altSettingId;
60    struct UsbSession *session;
61    OsalAtomic refCount;
62    bool forceDetachKernelDriver;
63};
64
65struct UsbInterfacePool {
66    struct UsbObject object;
67    struct UsbSession *session;
68    struct OsalMutex mutex;
69    struct DListHead interfaceList;
70    struct OsalMutex interfaceLock;
71    OsalAtomic refCount;
72    uint8_t busNum;
73    uint8_t devAddr;
74    OsalAtomic ioRefCount;
75    struct OsalThread ioSendProcess;
76    struct OsalThread ioAsyncReceiveProcess;
77    struct UsbMessageQueue submitRequestQueue;
78    UsbRawTidType ioProcessTid;
79    UsbPoolProcessStatusType ioProcessStopStatus;
80    UsbPoolProcessStatusType ioRecvProcessStopStatus;
81    struct OsalMutex ioStopLock;
82    struct UsbDevice *device;
83    struct OsalSem ioSem;
84};
85
86struct UsbPipeQueryPara {
87    UsbPipeQueryParaType type;
88    union {
89        uint8_t pipeId;
90        UsbPipeDirection pipeDirection;
91    };
92};
93
94struct UsbInterfaceQueryPara {
95    UsbInterfaceQueryParaType type;
96    uint8_t interfaceIndex;
97    uint8_t altSettingId;
98};
99
100struct UsbPoolQueryPara {
101    UsbPoolQueryParaType type;
102    union {
103        struct {
104            uint8_t busNum;
105            uint8_t usbAddr;
106        };
107        int32_t objectId;
108    };
109};
110
111struct UsbIfRequest {
112    struct UsbRequest request;
113    struct UsbHostRequest *hostRequest;
114    bool isSyncReq;
115}__attribute__((aligned(4)));
116
117int32_t UsbIfCreatPipeObj(const struct UsbSdkInterface *interfaceObj, struct UsbPipe **pipeObj);
118int32_t UsbIfCreatInterfaceObj(const struct UsbInterfacePool *interfacePool, struct UsbSdkInterface **interfaceObj);
119HDF_STATUS UsbIfDestroyInterfaceObj(
120    const struct UsbInterfacePool *interfacePool, const struct UsbSdkInterface *interfaceObj);
121int32_t UsbIfCreatInterfacePool(const struct UsbSession *session, uint8_t busNum, uint8_t devAddr,
122    struct UsbInterfacePool **interfacePool);
123int32_t UsbCloseCtlProcess(const UsbInterfaceHandle *interfaceHandle);
124
125#endif /* USB_INTERFACE_POOL_H */
126