Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
e6dfb043
K
Kernel
项目概览
openeuler
/
Kernel
大约 1 年 前同步成功
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e6dfb043
编写于
8月 01, 2013
作者:
J
Jiri Kosina
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'for-3.11/upstream-fixes' and 'for-3.11/logitech-enumeration-fix' into for-linus
上级
8e552e53
407a2c2a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
48 addition
and
0 deletion
+48
-0
drivers/hid/hid-logitech-dj.c
drivers/hid/hid-logitech-dj.c
+47
-0
drivers/hid/hid-logitech-dj.h
drivers/hid/hid-logitech-dj.h
+1
-0
未找到文件。
drivers/hid/hid-logitech-dj.c
浏览文件 @
e6dfb043
...
...
@@ -192,6 +192,7 @@ static struct hid_ll_driver logi_dj_ll_driver;
static
int
logi_dj_output_hidraw_report
(
struct
hid_device
*
hid
,
u8
*
buf
,
size_t
count
,
unsigned
char
report_type
);
static
int
logi_dj_recv_query_paired_devices
(
struct
dj_receiver_dev
*
djrcv_dev
);
static
void
logi_dj_recv_destroy_djhid_device
(
struct
dj_receiver_dev
*
djrcv_dev
,
struct
dj_report
*
dj_report
)
...
...
@@ -232,6 +233,7 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
if
(
dj_report
->
report_params
[
DEVICE_PAIRED_PARAM_SPFUNCTION
]
&
SPFUNCTION_DEVICE_LIST_EMPTY
)
{
dbg_hid
(
"%s: device list is empty
\n
"
,
__func__
);
djrcv_dev
->
querying_devices
=
false
;
return
;
}
...
...
@@ -242,6 +244,12 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
return
;
}
if
(
djrcv_dev
->
paired_dj_devices
[
dj_report
->
device_index
])
{
/* The device is already known. No need to reallocate it. */
dbg_hid
(
"%s: device is already known
\n
"
,
__func__
);
return
;
}
dj_hiddev
=
hid_allocate_device
();
if
(
IS_ERR
(
dj_hiddev
))
{
dev_err
(
&
djrcv_hdev
->
dev
,
"%s: hid_allocate_device failed
\n
"
,
...
...
@@ -305,6 +313,7 @@ static void delayedwork_callback(struct work_struct *work)
struct
dj_report
dj_report
;
unsigned
long
flags
;
int
count
;
int
retval
;
dbg_hid
(
"%s
\n
"
,
__func__
);
...
...
@@ -337,6 +346,25 @@ static void delayedwork_callback(struct work_struct *work)
logi_dj_recv_destroy_djhid_device
(
djrcv_dev
,
&
dj_report
);
break
;
default:
/* A normal report (i. e. not belonging to a pair/unpair notification)
* arriving here, means that the report arrived but we did not have a
* paired dj_device associated to the report's device_index, this
* means that the original "device paired" notification corresponding
* to this dj_device never arrived to this driver. The reason is that
* hid-core discards all packets coming from a device while probe() is
* executing. */
if
(
!
djrcv_dev
->
paired_dj_devices
[
dj_report
.
device_index
])
{
/* ok, we don't know the device, just re-ask the
* receiver for the list of connected devices. */
retval
=
logi_dj_recv_query_paired_devices
(
djrcv_dev
);
if
(
!
retval
)
{
/* everything went fine, so just leave */
break
;
}
dev_err
(
&
djrcv_dev
->
hdev
->
dev
,
"%s:logi_dj_recv_query_paired_devices "
"error:%d
\n
"
,
__func__
,
retval
);
}
dbg_hid
(
"%s: unexpected report type
\n
"
,
__func__
);
}
}
...
...
@@ -367,6 +395,12 @@ static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
if
(
!
djdev
)
{
dbg_hid
(
"djrcv_dev->paired_dj_devices[dj_report->device_index]"
" is NULL, index %d
\n
"
,
dj_report
->
device_index
);
kfifo_in
(
&
djrcv_dev
->
notif_fifo
,
dj_report
,
sizeof
(
struct
dj_report
));
if
(
schedule_work
(
&
djrcv_dev
->
work
)
==
0
)
{
dbg_hid
(
"%s: did not schedule the work item, was already "
"queued
\n
"
,
__func__
);
}
return
;
}
...
...
@@ -397,6 +431,12 @@ static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev,
if
(
dj_device
==
NULL
)
{
dbg_hid
(
"djrcv_dev->paired_dj_devices[dj_report->device_index]"
" is NULL, index %d
\n
"
,
dj_report
->
device_index
);
kfifo_in
(
&
djrcv_dev
->
notif_fifo
,
dj_report
,
sizeof
(
struct
dj_report
));
if
(
schedule_work
(
&
djrcv_dev
->
work
)
==
0
)
{
dbg_hid
(
"%s: did not schedule the work item, was already "
"queued
\n
"
,
__func__
);
}
return
;
}
...
...
@@ -444,6 +484,12 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
struct
dj_report
*
dj_report
;
int
retval
;
/* no need to protect djrcv_dev->querying_devices */
if
(
djrcv_dev
->
querying_devices
)
return
0
;
djrcv_dev
->
querying_devices
=
true
;
dj_report
=
kzalloc
(
sizeof
(
struct
dj_report
),
GFP_KERNEL
);
if
(
!
dj_report
)
return
-
ENOMEM
;
...
...
@@ -455,6 +501,7 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
return
retval
;
}
static
int
logi_dj_recv_switch_to_dj_mode
(
struct
dj_receiver_dev
*
djrcv_dev
,
unsigned
timeout
)
{
...
...
drivers/hid/hid-logitech-dj.h
浏览文件 @
e6dfb043
...
...
@@ -101,6 +101,7 @@ struct dj_receiver_dev {
struct
work_struct
work
;
struct
kfifo
notif_fifo
;
spinlock_t
lock
;
bool
querying_devices
;
};
struct
dj_device
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录