Merge 4ad680f083 ("Merge tag 'staging-5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging") into android-mainline
Steps on the way to 5.19-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ib8ea92592ccd22820e027da7ec71c650b73ba84f
This commit is contained in:
commit
2b869d8965
284 changed files with 3083 additions and 14776 deletions
10
MAINTAINERS
10
MAINTAINERS
|
|
@ -20385,14 +20385,6 @@ F: drivers/cdrom/cdrom.c
|
|||
F: include/linux/cdrom.h
|
||||
F: include/uapi/linux/cdrom.h
|
||||
|
||||
UNISYS S-PAR DRIVERS
|
||||
M: David Kershner <david.kershner@unisys.com>
|
||||
L: sparmaintainer@unisys.com (Unisys internal)
|
||||
S: Supported
|
||||
F: drivers/staging/unisys/
|
||||
F: drivers/visorbus/
|
||||
F: include/linux/visorbus.h
|
||||
|
||||
UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER
|
||||
R: Alim Akhtar <alim.akhtar@samsung.com>
|
||||
R: Avri Altman <avri.altman@wdc.com>
|
||||
|
|
@ -21211,7 +21203,7 @@ L: linux-kernel@vger.kernel.org
|
|||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||
F: Documentation/driver-api/vme.rst
|
||||
F: drivers/staging/vme/
|
||||
F: drivers/staging/vme_user/
|
||||
F: drivers/vme/
|
||||
F: include/linux/vme*
|
||||
|
||||
|
|
|
|||
|
|
@ -725,6 +725,7 @@ static void bio_alloc_cache_destroy(struct bio_set *bs)
|
|||
bio_alloc_cache_prune(cache, -1U);
|
||||
}
|
||||
free_percpu(bs->cache);
|
||||
bs->cache = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1369,10 +1370,12 @@ void bio_copy_data_iter(struct bio *dst, struct bvec_iter *dst_iter,
|
|||
struct bio_vec src_bv = bio_iter_iovec(src, *src_iter);
|
||||
struct bio_vec dst_bv = bio_iter_iovec(dst, *dst_iter);
|
||||
unsigned int bytes = min(src_bv.bv_len, dst_bv.bv_len);
|
||||
void *src_buf;
|
||||
void *src_buf = bvec_kmap_local(&src_bv);
|
||||
void *dst_buf = bvec_kmap_local(&dst_bv);
|
||||
|
||||
src_buf = bvec_kmap_local(&src_bv);
|
||||
memcpy_to_bvec(&dst_bv, src_buf);
|
||||
memcpy(dst_buf, src_buf, bytes);
|
||||
|
||||
kunmap_local(dst_buf);
|
||||
kunmap_local(src_buf);
|
||||
|
||||
bio_advance_iter_single(src, src_iter, bytes);
|
||||
|
|
|
|||
|
|
@ -1974,12 +1974,8 @@ EXPORT_SYMBOL_GPL(bio_associate_blkg);
|
|||
*/
|
||||
void bio_clone_blkg_association(struct bio *dst, struct bio *src)
|
||||
{
|
||||
if (src->bi_blkg) {
|
||||
if (dst->bi_blkg)
|
||||
blkg_put(dst->bi_blkg);
|
||||
blkg_get(src->bi_blkg);
|
||||
dst->bi_blkg = src->bi_blkg;
|
||||
}
|
||||
if (src->bi_blkg)
|
||||
bio_associate_blkg_from_css(dst, bio_blkcg_css(src));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bio_clone_blkg_association);
|
||||
|
||||
|
|
|
|||
|
|
@ -939,7 +939,7 @@ int bio_poll(struct bio *bio, struct io_comp_batch *iob, unsigned int flags)
|
|||
|
||||
blk_flush_plug(current->plug, false);
|
||||
|
||||
if (blk_queue_enter(q, BLK_MQ_REQ_NOWAIT))
|
||||
if (bio_queue_enter(bio))
|
||||
return 0;
|
||||
if (queue_is_mq(q)) {
|
||||
ret = blk_mq_poll(q, cookie, iob, flags);
|
||||
|
|
|
|||
|
|
@ -54,13 +54,8 @@ static ssize_t blk_ia_range_sysfs_show(struct kobject *kobj,
|
|||
container_of(attr, struct blk_ia_range_sysfs_entry, attr);
|
||||
struct blk_independent_access_range *iar =
|
||||
container_of(kobj, struct blk_independent_access_range, kobj);
|
||||
ssize_t ret;
|
||||
|
||||
mutex_lock(&iar->queue->sysfs_lock);
|
||||
ret = entry->show(iar, buf);
|
||||
mutex_unlock(&iar->queue->sysfs_lock);
|
||||
|
||||
return ret;
|
||||
return entry->show(iar, buf);
|
||||
}
|
||||
|
||||
static const struct sysfs_ops blk_ia_range_sysfs_ops = {
|
||||
|
|
|
|||
|
|
@ -87,7 +87,17 @@ struct iolatency_grp;
|
|||
struct blk_iolatency {
|
||||
struct rq_qos rqos;
|
||||
struct timer_list timer;
|
||||
atomic_t enabled;
|
||||
|
||||
/*
|
||||
* ->enabled is the master enable switch gating the throttling logic and
|
||||
* inflight tracking. The number of cgroups which have iolat enabled is
|
||||
* tracked in ->enable_cnt, and ->enable is flipped on/off accordingly
|
||||
* from ->enable_work with the request_queue frozen. For details, See
|
||||
* blkiolatency_enable_work_fn().
|
||||
*/
|
||||
bool enabled;
|
||||
atomic_t enable_cnt;
|
||||
struct work_struct enable_work;
|
||||
};
|
||||
|
||||
static inline struct blk_iolatency *BLKIOLATENCY(struct rq_qos *rqos)
|
||||
|
|
@ -95,11 +105,6 @@ static inline struct blk_iolatency *BLKIOLATENCY(struct rq_qos *rqos)
|
|||
return container_of(rqos, struct blk_iolatency, rqos);
|
||||
}
|
||||
|
||||
static inline bool blk_iolatency_enabled(struct blk_iolatency *blkiolat)
|
||||
{
|
||||
return atomic_read(&blkiolat->enabled) > 0;
|
||||
}
|
||||
|
||||
struct child_latency_info {
|
||||
spinlock_t lock;
|
||||
|
||||
|
|
@ -464,7 +469,7 @@ static void blkcg_iolatency_throttle(struct rq_qos *rqos, struct bio *bio)
|
|||
struct blkcg_gq *blkg = bio->bi_blkg;
|
||||
bool issue_as_root = bio_issue_as_root_blkg(bio);
|
||||
|
||||
if (!blk_iolatency_enabled(blkiolat))
|
||||
if (!blkiolat->enabled)
|
||||
return;
|
||||
|
||||
while (blkg && blkg->parent) {
|
||||
|
|
@ -594,7 +599,6 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio)
|
|||
u64 window_start;
|
||||
u64 now;
|
||||
bool issue_as_root = bio_issue_as_root_blkg(bio);
|
||||
bool enabled = false;
|
||||
int inflight = 0;
|
||||
|
||||
blkg = bio->bi_blkg;
|
||||
|
|
@ -605,8 +609,7 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio)
|
|||
if (!iolat)
|
||||
return;
|
||||
|
||||
enabled = blk_iolatency_enabled(iolat->blkiolat);
|
||||
if (!enabled)
|
||||
if (!iolat->blkiolat->enabled)
|
||||
return;
|
||||
|
||||
now = ktime_to_ns(ktime_get());
|
||||
|
|
@ -645,6 +648,7 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos)
|
|||
struct blk_iolatency *blkiolat = BLKIOLATENCY(rqos);
|
||||
|
||||
del_timer_sync(&blkiolat->timer);
|
||||
flush_work(&blkiolat->enable_work);
|
||||
blkcg_deactivate_policy(rqos->q, &blkcg_policy_iolatency);
|
||||
kfree(blkiolat);
|
||||
}
|
||||
|
|
@ -716,6 +720,44 @@ next:
|
|||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* blkiolatency_enable_work_fn - Enable or disable iolatency on the device
|
||||
* @work: enable_work of the blk_iolatency of interest
|
||||
*
|
||||
* iolatency needs to keep track of the number of in-flight IOs per cgroup. This
|
||||
* is relatively expensive as it involves walking up the hierarchy twice for
|
||||
* every IO. Thus, if iolatency is not enabled in any cgroup for the device, we
|
||||
* want to disable the in-flight tracking.
|
||||
*
|
||||
* We have to make sure that the counting is balanced - we don't want to leak
|
||||
* the in-flight counts by disabling accounting in the completion path while IOs
|
||||
* are in flight. This is achieved by ensuring that no IO is in flight by
|
||||
* freezing the queue while flipping ->enabled. As this requires a sleepable
|
||||
* context, ->enabled flipping is punted to this work function.
|
||||
*/
|
||||
static void blkiolatency_enable_work_fn(struct work_struct *work)
|
||||
{
|
||||
struct blk_iolatency *blkiolat = container_of(work, struct blk_iolatency,
|
||||
enable_work);
|
||||
bool enabled;
|
||||
|
||||
/*
|
||||
* There can only be one instance of this function running for @blkiolat
|
||||
* and it's guaranteed to be executed at least once after the latest
|
||||
* ->enabled_cnt modification. Acting on the latest ->enable_cnt is
|
||||
* sufficient.
|
||||
*
|
||||
* Also, we know @blkiolat is safe to access as ->enable_work is flushed
|
||||
* in blkcg_iolatency_exit().
|
||||
*/
|
||||
enabled = atomic_read(&blkiolat->enable_cnt);
|
||||
if (enabled != blkiolat->enabled) {
|
||||
blk_mq_freeze_queue(blkiolat->rqos.q);
|
||||
blkiolat->enabled = enabled;
|
||||
blk_mq_unfreeze_queue(blkiolat->rqos.q);
|
||||
}
|
||||
}
|
||||
|
||||
int blk_iolatency_init(struct request_queue *q)
|
||||
{
|
||||
struct blk_iolatency *blkiolat;
|
||||
|
|
@ -741,17 +783,15 @@ int blk_iolatency_init(struct request_queue *q)
|
|||
}
|
||||
|
||||
timer_setup(&blkiolat->timer, blkiolatency_timer_fn, 0);
|
||||
INIT_WORK(&blkiolat->enable_work, blkiolatency_enable_work_fn);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* return 1 for enabling iolatency, return -1 for disabling iolatency, otherwise
|
||||
* return 0.
|
||||
*/
|
||||
static int iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val)
|
||||
static void iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val)
|
||||
{
|
||||
struct iolatency_grp *iolat = blkg_to_lat(blkg);
|
||||
struct blk_iolatency *blkiolat = iolat->blkiolat;
|
||||
u64 oldval = iolat->min_lat_nsec;
|
||||
|
||||
iolat->min_lat_nsec = val;
|
||||
|
|
@ -759,13 +799,15 @@ static int iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val)
|
|||
iolat->cur_win_nsec = min_t(u64, iolat->cur_win_nsec,
|
||||
BLKIOLATENCY_MAX_WIN_SIZE);
|
||||
|
||||
if (!oldval && val)
|
||||
return 1;
|
||||
if (!oldval && val) {
|
||||
if (atomic_inc_return(&blkiolat->enable_cnt) == 1)
|
||||
schedule_work(&blkiolat->enable_work);
|
||||
}
|
||||
if (oldval && !val) {
|
||||
blkcg_clear_delay(blkg);
|
||||
return -1;
|
||||
if (atomic_dec_return(&blkiolat->enable_cnt) == 0)
|
||||
schedule_work(&blkiolat->enable_work);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void iolatency_clear_scaling(struct blkcg_gq *blkg)
|
||||
|
|
@ -797,7 +839,6 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
|
|||
u64 lat_val = 0;
|
||||
u64 oldval;
|
||||
int ret;
|
||||
int enable = 0;
|
||||
|
||||
ret = blkg_conf_prep(blkcg, &blkcg_policy_iolatency, buf, &ctx);
|
||||
if (ret)
|
||||
|
|
@ -832,41 +873,12 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
|
|||
blkg = ctx.blkg;
|
||||
oldval = iolat->min_lat_nsec;
|
||||
|
||||
enable = iolatency_set_min_lat_nsec(blkg, lat_val);
|
||||
if (enable) {
|
||||
if (!blk_get_queue(blkg->q)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
blkg_get(blkg);
|
||||
}
|
||||
|
||||
if (oldval != iolat->min_lat_nsec) {
|
||||
iolatency_set_min_lat_nsec(blkg, lat_val);
|
||||
if (oldval != iolat->min_lat_nsec)
|
||||
iolatency_clear_scaling(blkg);
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
blkg_conf_finish(&ctx);
|
||||
if (ret == 0 && enable) {
|
||||
struct iolatency_grp *tmp = blkg_to_lat(blkg);
|
||||
struct blk_iolatency *blkiolat = tmp->blkiolat;
|
||||
|
||||
blk_mq_freeze_queue(blkg->q);
|
||||
|
||||
if (enable == 1)
|
||||
atomic_inc(&blkiolat->enabled);
|
||||
else if (enable == -1)
|
||||
atomic_dec(&blkiolat->enabled);
|
||||
else
|
||||
WARN_ON_ONCE(1);
|
||||
|
||||
blk_mq_unfreeze_queue(blkg->q);
|
||||
|
||||
blkg_put(blkg);
|
||||
blk_put_queue(blkg->q);
|
||||
}
|
||||
return ret ?: nbytes;
|
||||
}
|
||||
|
||||
|
|
@ -1005,14 +1017,8 @@ static void iolatency_pd_offline(struct blkg_policy_data *pd)
|
|||
{
|
||||
struct iolatency_grp *iolat = pd_to_lat(pd);
|
||||
struct blkcg_gq *blkg = lat_to_blkg(iolat);
|
||||
struct blk_iolatency *blkiolat = iolat->blkiolat;
|
||||
int ret;
|
||||
|
||||
ret = iolatency_set_min_lat_nsec(blkg, 0);
|
||||
if (ret == 1)
|
||||
atomic_inc(&blkiolat->enabled);
|
||||
if (ret == -1)
|
||||
atomic_dec(&blkiolat->enabled);
|
||||
iolatency_set_min_lat_nsec(blkg, 0);
|
||||
iolatency_clear_scaling(blkg);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -228,7 +228,6 @@ void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx,
|
|||
BUG_ON(real_tag >= tags->nr_tags);
|
||||
sbitmap_queue_clear(&tags->bitmap_tags, real_tag, ctx->cpu);
|
||||
} else {
|
||||
BUG_ON(tag >= tags->nr_reserved_tags);
|
||||
sbitmap_queue_clear(&tags->breserved_tags, tag, ctx->cpu);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
119
block/blk-mq.c
119
block/blk-mq.c
|
|
@ -133,7 +133,8 @@ static bool blk_mq_check_inflight(struct request *rq, void *priv,
|
|||
{
|
||||
struct mq_inflight *mi = priv;
|
||||
|
||||
if ((!mi->part->bd_partno || rq->part == mi->part) &&
|
||||
if (rq->part && blk_do_io_stat(rq) &&
|
||||
(!mi->part->bd_partno || rq->part == mi->part) &&
|
||||
blk_mq_rq_state(rq) == MQ_RQ_IN_FLIGHT)
|
||||
mi->inflight[rq_data_dir(rq)]++;
|
||||
|
||||
|
|
@ -1151,24 +1152,6 @@ void blk_mq_start_request(struct request *rq)
|
|||
}
|
||||
EXPORT_SYMBOL(blk_mq_start_request);
|
||||
|
||||
/**
|
||||
* blk_end_sync_rq - executes a completion event on a request
|
||||
* @rq: request to complete
|
||||
* @error: end I/O status of the request
|
||||
*/
|
||||
static void blk_end_sync_rq(struct request *rq, blk_status_t error)
|
||||
{
|
||||
struct completion *waiting = rq->end_io_data;
|
||||
|
||||
rq->end_io_data = (void *)(uintptr_t)error;
|
||||
|
||||
/*
|
||||
* complete last, if this is a stack request the process (and thus
|
||||
* the rq pointer) could be invalid right after this complete()
|
||||
*/
|
||||
complete(waiting);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allow 2x BLK_MAX_REQUEST_COUNT requests on plug queue for multiple
|
||||
* queues. This is important for md arrays to benefit from merging
|
||||
|
|
@ -1203,33 +1186,10 @@ static void blk_add_rq_to_plug(struct blk_plug *plug, struct request *rq)
|
|||
plug->rq_count++;
|
||||
}
|
||||
|
||||
static void __blk_execute_rq_nowait(struct request *rq, bool at_head,
|
||||
rq_end_io_fn *done, bool use_plug)
|
||||
{
|
||||
WARN_ON(irqs_disabled());
|
||||
WARN_ON(!blk_rq_is_passthrough(rq));
|
||||
|
||||
rq->end_io = done;
|
||||
|
||||
blk_account_io_start(rq);
|
||||
|
||||
if (use_plug && current->plug) {
|
||||
blk_add_rq_to_plug(current->plug, rq);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* don't check dying flag for MQ because the request won't
|
||||
* be reused after dying flag is set
|
||||
*/
|
||||
blk_mq_sched_insert_request(rq, at_head, true, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* blk_execute_rq_nowait - insert a request to I/O scheduler for execution
|
||||
* @rq: request to insert
|
||||
* @at_head: insert request at head or tail of queue
|
||||
* @done: I/O completion handler
|
||||
*
|
||||
* Description:
|
||||
* Insert a fully prepared request at the back of the I/O scheduler queue
|
||||
|
|
@ -1238,13 +1198,32 @@ static void __blk_execute_rq_nowait(struct request *rq, bool at_head,
|
|||
* Note:
|
||||
* This function will invoke @done directly if the queue is dead.
|
||||
*/
|
||||
void blk_execute_rq_nowait(struct request *rq, bool at_head, rq_end_io_fn *done)
|
||||
void blk_execute_rq_nowait(struct request *rq, bool at_head)
|
||||
{
|
||||
__blk_execute_rq_nowait(rq, at_head, done, true);
|
||||
WARN_ON(irqs_disabled());
|
||||
WARN_ON(!blk_rq_is_passthrough(rq));
|
||||
|
||||
blk_account_io_start(rq);
|
||||
if (current->plug)
|
||||
blk_add_rq_to_plug(current->plug, rq);
|
||||
else
|
||||
blk_mq_sched_insert_request(rq, at_head, true, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_execute_rq_nowait);
|
||||
|
||||
struct blk_rq_wait {
|
||||
struct completion done;
|
||||
blk_status_t ret;
|
||||
};
|
||||
|
||||
static void blk_end_sync_rq(struct request *rq, blk_status_t ret)
|
||||
{
|
||||
struct blk_rq_wait *wait = rq->end_io_data;
|
||||
|
||||
wait->ret = ret;
|
||||
complete(&wait->done);
|
||||
}
|
||||
|
||||
static bool blk_rq_is_poll(struct request *rq)
|
||||
{
|
||||
if (!rq->mq_hctx)
|
||||
|
|
@ -1276,30 +1255,37 @@ static void blk_rq_poll_completion(struct request *rq, struct completion *wait)
|
|||
*/
|
||||
blk_status_t blk_execute_rq(struct request *rq, bool at_head)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(wait);
|
||||
unsigned long hang_check;
|
||||
struct blk_rq_wait wait = {
|
||||
.done = COMPLETION_INITIALIZER_ONSTACK(wait.done),
|
||||
};
|
||||
|
||||
WARN_ON(irqs_disabled());
|
||||
WARN_ON(!blk_rq_is_passthrough(rq));
|
||||
|
||||
/*
|
||||
* iopoll requires request to be submitted to driver, so can't
|
||||
* use plug
|
||||
*/
|
||||
rq->end_io_data = &wait;
|
||||
__blk_execute_rq_nowait(rq, at_head, blk_end_sync_rq,
|
||||
!blk_rq_is_poll(rq));
|
||||
rq->end_io = blk_end_sync_rq;
|
||||
|
||||
/* Prevent hang_check timer from firing at us during very long I/O */
|
||||
hang_check = sysctl_hung_task_timeout_secs;
|
||||
blk_account_io_start(rq);
|
||||
blk_mq_sched_insert_request(rq, at_head, true, false);
|
||||
|
||||
if (blk_rq_is_poll(rq))
|
||||
blk_rq_poll_completion(rq, &wait);
|
||||
else if (hang_check)
|
||||
while (!wait_for_completion_io_timeout(&wait,
|
||||
hang_check * (HZ/2)))
|
||||
;
|
||||
else
|
||||
wait_for_completion_io(&wait);
|
||||
if (blk_rq_is_poll(rq)) {
|
||||
blk_rq_poll_completion(rq, &wait.done);
|
||||
} else {
|
||||
/*
|
||||
* Prevent hang_check timer from firing at us during very long
|
||||
* I/O
|
||||
*/
|
||||
unsigned long hang_check = sysctl_hung_task_timeout_secs;
|
||||
|
||||
return (blk_status_t)(uintptr_t)rq->end_io_data;
|
||||
if (hang_check)
|
||||
while (!wait_for_completion_io_timeout(&wait.done,
|
||||
hang_check * (HZ/2)))
|
||||
;
|
||||
else
|
||||
wait_for_completion_io(&wait.done);
|
||||
}
|
||||
|
||||
return wait.ret;
|
||||
}
|
||||
EXPORT_SYMBOL(blk_execute_rq);
|
||||
|
||||
|
|
@ -2174,8 +2160,7 @@ static bool blk_mq_has_sqsched(struct request_queue *q)
|
|||
*/
|
||||
static struct blk_mq_hw_ctx *blk_mq_get_sq_hctx(struct request_queue *q)
|
||||
{
|
||||
struct blk_mq_hw_ctx *hctx;
|
||||
|
||||
struct blk_mq_ctx *ctx = blk_mq_get_ctx(q);
|
||||
/*
|
||||
* If the IO scheduler does not respect hardware queues when
|
||||
* dispatching, we just don't bother with multiple HW queues and
|
||||
|
|
@ -2183,8 +2168,8 @@ static struct blk_mq_hw_ctx *blk_mq_get_sq_hctx(struct request_queue *q)
|
|||
* just causes lock contention inside the scheduler and pointless cache
|
||||
* bouncing.
|
||||
*/
|
||||
hctx = blk_mq_map_queue_type(q, HCTX_TYPE_DEFAULT,
|
||||
raw_smp_processor_id());
|
||||
struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, 0, ctx);
|
||||
|
||||
if (!blk_mq_hctx_stopped(hctx))
|
||||
return hctx;
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -385,6 +385,8 @@ int disk_scan_partitions(struct gendisk *disk, fmode_t mode)
|
|||
|
||||
if (disk->flags & (GENHD_FL_NO_PART | GENHD_FL_HIDDEN))
|
||||
return -EINVAL;
|
||||
if (test_bit(GD_SUPPRESS_PART_SCAN, &disk->state))
|
||||
return -EINVAL;
|
||||
if (disk->open_partitions)
|
||||
return -EBUSY;
|
||||
|
||||
|
|
|
|||
|
|
@ -225,8 +225,6 @@ source "drivers/mux/Kconfig"
|
|||
|
||||
source "drivers/opp/Kconfig"
|
||||
|
||||
source "drivers/visorbus/Kconfig"
|
||||
|
||||
source "drivers/siox/Kconfig"
|
||||
|
||||
source "drivers/slimbus/Kconfig"
|
||||
|
|
|
|||
|
|
@ -181,7 +181,6 @@ obj-$(CONFIG_FPGA) += fpga/
|
|||
obj-$(CONFIG_FSI) += fsi/
|
||||
obj-$(CONFIG_TEE) += tee/
|
||||
obj-$(CONFIG_MULTIPLEXER) += mux/
|
||||
obj-$(CONFIG_UNISYS_VISORBUS) += visorbus/
|
||||
obj-$(CONFIG_SIOX) += siox/
|
||||
obj-$(CONFIG_GNSS) += gnss/
|
||||
obj-$(CONFIG_INTERCONNECT) += interconnect/
|
||||
|
|
|
|||
|
|
@ -1102,7 +1102,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
|
|||
lo->lo_flags |= LO_FLAGS_PARTSCAN;
|
||||
partscan = lo->lo_flags & LO_FLAGS_PARTSCAN;
|
||||
if (partscan)
|
||||
lo->lo_disk->flags &= ~GENHD_FL_NO_PART;
|
||||
clear_bit(GD_SUPPRESS_PART_SCAN, &lo->lo_disk->state);
|
||||
|
||||
loop_global_unlock(lo, is_loop);
|
||||
if (partscan)
|
||||
|
|
@ -1198,7 +1198,7 @@ static void __loop_clr_fd(struct loop_device *lo, bool release)
|
|||
*/
|
||||
lo->lo_flags = 0;
|
||||
if (!part_shift)
|
||||
lo->lo_disk->flags |= GENHD_FL_NO_PART;
|
||||
set_bit(GD_SUPPRESS_PART_SCAN, &lo->lo_disk->state);
|
||||
mutex_lock(&lo->lo_mutex);
|
||||
lo->lo_state = Lo_unbound;
|
||||
mutex_unlock(&lo->lo_mutex);
|
||||
|
|
@ -1308,7 +1308,7 @@ out_unfreeze:
|
|||
|
||||
if (!err && (lo->lo_flags & LO_FLAGS_PARTSCAN) &&
|
||||
!(prev_lo_flags & LO_FLAGS_PARTSCAN)) {
|
||||
lo->lo_disk->flags &= ~GENHD_FL_NO_PART;
|
||||
clear_bit(GD_SUPPRESS_PART_SCAN, &lo->lo_disk->state);
|
||||
partscan = true;
|
||||
}
|
||||
out_unlock:
|
||||
|
|
@ -2011,7 +2011,7 @@ static int loop_add(int i)
|
|||
* userspace tools. Parameters like this in general should be avoided.
|
||||
*/
|
||||
if (!part_shift)
|
||||
disk->flags |= GENHD_FL_NO_PART;
|
||||
set_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
|
||||
mutex_init(&lo->lo_mutex);
|
||||
lo->lo_number = i;
|
||||
spin_lock_init(&lo->lo_lock);
|
||||
|
|
|
|||
|
|
@ -403,13 +403,14 @@ static enum blk_eh_timer_return nbd_xmit_timeout(struct request *req,
|
|||
if (!mutex_trylock(&cmd->lock))
|
||||
return BLK_EH_RESET_TIMER;
|
||||
|
||||
if (!__test_and_clear_bit(NBD_CMD_INFLIGHT, &cmd->flags)) {
|
||||
if (!test_bit(NBD_CMD_INFLIGHT, &cmd->flags)) {
|
||||
mutex_unlock(&cmd->lock);
|
||||
return BLK_EH_DONE;
|
||||
}
|
||||
|
||||
if (!refcount_inc_not_zero(&nbd->config_refs)) {
|
||||
cmd->status = BLK_STS_TIMEOUT;
|
||||
__clear_bit(NBD_CMD_INFLIGHT, &cmd->flags);
|
||||
mutex_unlock(&cmd->lock);
|
||||
goto done;
|
||||
}
|
||||
|
|
@ -478,6 +479,7 @@ static enum blk_eh_timer_return nbd_xmit_timeout(struct request *req,
|
|||
dev_err_ratelimited(nbd_to_dev(nbd), "Connection timed out\n");
|
||||
set_bit(NBD_RT_TIMEDOUT, &config->runtime_flags);
|
||||
cmd->status = BLK_STS_IOERR;
|
||||
__clear_bit(NBD_CMD_INFLIGHT, &cmd->flags);
|
||||
mutex_unlock(&cmd->lock);
|
||||
sock_shutdown(nbd);
|
||||
nbd_config_put(nbd);
|
||||
|
|
@ -745,7 +747,7 @@ static struct nbd_cmd *nbd_handle_reply(struct nbd_device *nbd, int index,
|
|||
cmd = blk_mq_rq_to_pdu(req);
|
||||
|
||||
mutex_lock(&cmd->lock);
|
||||
if (!__test_and_clear_bit(NBD_CMD_INFLIGHT, &cmd->flags)) {
|
||||
if (!test_bit(NBD_CMD_INFLIGHT, &cmd->flags)) {
|
||||
dev_err(disk_to_dev(nbd->disk), "Suspicious reply %d (status %u flags %lu)",
|
||||
tag, cmd->status, cmd->flags);
|
||||
ret = -ENOENT;
|
||||
|
|
@ -854,8 +856,16 @@ static void recv_work(struct work_struct *work)
|
|||
}
|
||||
|
||||
rq = blk_mq_rq_from_pdu(cmd);
|
||||
if (likely(!blk_should_fake_timeout(rq->q)))
|
||||
blk_mq_complete_request(rq);
|
||||
if (likely(!blk_should_fake_timeout(rq->q))) {
|
||||
bool complete;
|
||||
|
||||
mutex_lock(&cmd->lock);
|
||||
complete = __test_and_clear_bit(NBD_CMD_INFLIGHT,
|
||||
&cmd->flags);
|
||||
mutex_unlock(&cmd->lock);
|
||||
if (complete)
|
||||
blk_mq_complete_request(rq);
|
||||
}
|
||||
percpu_ref_put(&q->q_usage_counter);
|
||||
}
|
||||
|
||||
|
|
@ -1419,7 +1429,7 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd)
|
|||
static void nbd_clear_sock_ioctl(struct nbd_device *nbd,
|
||||
struct block_device *bdev)
|
||||
{
|
||||
sock_shutdown(nbd);
|
||||
nbd_clear_sock(nbd);
|
||||
__invalidate_device(bdev, true);
|
||||
nbd_bdev_reset(nbd);
|
||||
if (test_and_clear_bit(NBD_RT_HAS_CONFIG_REF,
|
||||
|
|
@ -1518,15 +1528,20 @@ static struct nbd_config *nbd_alloc_config(void)
|
|||
{
|
||||
struct nbd_config *config;
|
||||
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
config = kzalloc(sizeof(struct nbd_config), GFP_NOFS);
|
||||
if (!config)
|
||||
return NULL;
|
||||
if (!config) {
|
||||
module_put(THIS_MODULE);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
atomic_set(&config->recv_threads, 0);
|
||||
init_waitqueue_head(&config->recv_wq);
|
||||
init_waitqueue_head(&config->conn_wait);
|
||||
config->blksize_bits = NBD_DEF_BLKSIZE_BITS;
|
||||
atomic_set(&config->live_connections, 0);
|
||||
try_module_get(THIS_MODULE);
|
||||
return config;
|
||||
}
|
||||
|
||||
|
|
@ -1553,12 +1568,13 @@ static int nbd_open(struct block_device *bdev, fmode_t mode)
|
|||
mutex_unlock(&nbd->config_lock);
|
||||
goto out;
|
||||
}
|
||||
config = nbd->config = nbd_alloc_config();
|
||||
if (!config) {
|
||||
ret = -ENOMEM;
|
||||
config = nbd_alloc_config();
|
||||
if (IS_ERR(config)) {
|
||||
ret = PTR_ERR(config);
|
||||
mutex_unlock(&nbd->config_lock);
|
||||
goto out;
|
||||
}
|
||||
nbd->config = config;
|
||||
refcount_set(&nbd->config_refs, 1);
|
||||
refcount_inc(&nbd->refs);
|
||||
mutex_unlock(&nbd->config_lock);
|
||||
|
|
@ -1798,17 +1814,7 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs)
|
|||
refcount_set(&nbd->refs, 0);
|
||||
INIT_LIST_HEAD(&nbd->list);
|
||||
disk->major = NBD_MAJOR;
|
||||
|
||||
/* Too big first_minor can cause duplicate creation of
|
||||
* sysfs files/links, since index << part_shift might overflow, or
|
||||
* MKDEV() expect that the max bits of first_minor is 20.
|
||||
*/
|
||||
disk->first_minor = index << part_shift;
|
||||
if (disk->first_minor < index || disk->first_minor > MINORMASK) {
|
||||
err = -EINVAL;
|
||||
goto out_free_work;
|
||||
}
|
||||
|
||||
disk->minors = 1 << part_shift;
|
||||
disk->fops = &nbd_fops;
|
||||
disk->private_data = nbd;
|
||||
|
|
@ -1913,14 +1919,25 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
|
|||
if (!netlink_capable(skb, CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (info->attrs[NBD_ATTR_INDEX])
|
||||
if (info->attrs[NBD_ATTR_INDEX]) {
|
||||
index = nla_get_u32(info->attrs[NBD_ATTR_INDEX]);
|
||||
|
||||
/*
|
||||
* Too big first_minor can cause duplicate creation of
|
||||
* sysfs files/links, since index << part_shift might overflow, or
|
||||
* MKDEV() expect that the max bits of first_minor is 20.
|
||||
*/
|
||||
if (index < 0 || index > MINORMASK >> part_shift) {
|
||||
pr_err("illegal input index %d\n", index);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (!info->attrs[NBD_ATTR_SOCKETS]) {
|
||||
printk(KERN_ERR "nbd: must specify at least one socket\n");
|
||||
pr_err("must specify at least one socket\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!info->attrs[NBD_ATTR_SIZE_BYTES]) {
|
||||
printk(KERN_ERR "nbd: must specify a size in bytes for the device\n");
|
||||
pr_err("must specify a size in bytes for the device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
again:
|
||||
|
|
@ -1956,7 +1973,7 @@ again:
|
|||
nbd_put(nbd);
|
||||
if (index == -1)
|
||||
goto again;
|
||||
printk(KERN_ERR "nbd: nbd%d already in use\n", index);
|
||||
pr_err("nbd%d already in use\n", index);
|
||||
return -EBUSY;
|
||||
}
|
||||
if (WARN_ON(nbd->config)) {
|
||||
|
|
@ -1964,13 +1981,14 @@ again:
|
|||
nbd_put(nbd);
|
||||
return -EINVAL;
|
||||
}
|
||||
config = nbd->config = nbd_alloc_config();
|
||||
if (!nbd->config) {
|
||||
config = nbd_alloc_config();
|
||||
if (IS_ERR(config)) {
|
||||
mutex_unlock(&nbd->config_lock);
|
||||
nbd_put(nbd);
|
||||
printk(KERN_ERR "nbd: couldn't allocate config\n");
|
||||
return -ENOMEM;
|
||||
pr_err("couldn't allocate config\n");
|
||||
return PTR_ERR(config);
|
||||
}
|
||||
nbd->config = config;
|
||||
refcount_set(&nbd->config_refs, 1);
|
||||
set_bit(NBD_RT_BOUND, &config->runtime_flags);
|
||||
|
||||
|
|
@ -2023,7 +2041,7 @@ again:
|
|||
struct nlattr *socks[NBD_SOCK_MAX+1];
|
||||
|
||||
if (nla_type(attr) != NBD_SOCK_ITEM) {
|
||||
printk(KERN_ERR "nbd: socks must be embedded in a SOCK_ITEM attr\n");
|
||||
pr_err("socks must be embedded in a SOCK_ITEM attr\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -2032,7 +2050,7 @@ again:
|
|||
nbd_sock_policy,
|
||||
info->extack);
|
||||
if (ret != 0) {
|
||||
printk(KERN_ERR "nbd: error processing sock list\n");
|
||||
pr_err("error processing sock list\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -2104,7 +2122,7 @@ static int nbd_genl_disconnect(struct sk_buff *skb, struct genl_info *info)
|
|||
return -EPERM;
|
||||
|
||||
if (!info->attrs[NBD_ATTR_INDEX]) {
|
||||
printk(KERN_ERR "nbd: must specify an index to disconnect\n");
|
||||
pr_err("must specify an index to disconnect\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
index = nla_get_u32(info->attrs[NBD_ATTR_INDEX]);
|
||||
|
|
@ -2112,14 +2130,12 @@ static int nbd_genl_disconnect(struct sk_buff *skb, struct genl_info *info)
|
|||
nbd = idr_find(&nbd_index_idr, index);
|
||||
if (!nbd) {
|
||||
mutex_unlock(&nbd_index_mutex);
|
||||
printk(KERN_ERR "nbd: couldn't find device at index %d\n",
|
||||
index);
|
||||
pr_err("couldn't find device at index %d\n", index);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!refcount_inc_not_zero(&nbd->refs)) {
|
||||
mutex_unlock(&nbd_index_mutex);
|
||||
printk(KERN_ERR "nbd: device at index %d is going down\n",
|
||||
index);
|
||||
pr_err("device at index %d is going down\n", index);
|
||||
return -EINVAL;
|
||||
}
|
||||
mutex_unlock(&nbd_index_mutex);
|
||||
|
|
@ -2144,7 +2160,7 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)
|
|||
return -EPERM;
|
||||
|
||||
if (!info->attrs[NBD_ATTR_INDEX]) {
|
||||
printk(KERN_ERR "nbd: must specify a device to reconfigure\n");
|
||||
pr_err("must specify a device to reconfigure\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
index = nla_get_u32(info->attrs[NBD_ATTR_INDEX]);
|
||||
|
|
@ -2152,8 +2168,7 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)
|
|||
nbd = idr_find(&nbd_index_idr, index);
|
||||
if (!nbd) {
|
||||
mutex_unlock(&nbd_index_mutex);
|
||||
printk(KERN_ERR "nbd: couldn't find a device at index %d\n",
|
||||
index);
|
||||
pr_err("couldn't find a device at index %d\n", index);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (nbd->backend) {
|
||||
|
|
@ -2174,8 +2189,7 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)
|
|||
}
|
||||
if (!refcount_inc_not_zero(&nbd->refs)) {
|
||||
mutex_unlock(&nbd_index_mutex);
|
||||
printk(KERN_ERR "nbd: device at index %d is going down\n",
|
||||
index);
|
||||
pr_err("device at index %d is going down\n", index);
|
||||
return -EINVAL;
|
||||
}
|
||||
mutex_unlock(&nbd_index_mutex);
|
||||
|
|
@ -2239,7 +2253,7 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)
|
|||
struct nlattr *socks[NBD_SOCK_MAX+1];
|
||||
|
||||
if (nla_type(attr) != NBD_SOCK_ITEM) {
|
||||
printk(KERN_ERR "nbd: socks must be embedded in a SOCK_ITEM attr\n");
|
||||
pr_err("socks must be embedded in a SOCK_ITEM attr\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -2248,7 +2262,7 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)
|
|||
nbd_sock_policy,
|
||||
info->extack);
|
||||
if (ret != 0) {
|
||||
printk(KERN_ERR "nbd: error processing sock list\n");
|
||||
pr_err("error processing sock list\n");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
|
@ -2465,7 +2479,7 @@ static int __init nbd_init(void)
|
|||
BUILD_BUG_ON(sizeof(struct nbd_request) != 28);
|
||||
|
||||
if (max_part < 0) {
|
||||
printk(KERN_ERR "nbd: max_part must be >= 0\n");
|
||||
pr_err("max_part must be >= 0\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -2528,6 +2542,12 @@ static void __exit nbd_cleanup(void)
|
|||
struct nbd_device *nbd;
|
||||
LIST_HEAD(del_list);
|
||||
|
||||
/*
|
||||
* Unregister netlink interface prior to waiting
|
||||
* for the completion of netlink commands.
|
||||
*/
|
||||
genl_unregister_family(&nbd_genl_family);
|
||||
|
||||
nbd_dbg_close();
|
||||
|
||||
mutex_lock(&nbd_index_mutex);
|
||||
|
|
@ -2537,8 +2557,11 @@ static void __exit nbd_cleanup(void)
|
|||
while (!list_empty(&del_list)) {
|
||||
nbd = list_first_entry(&del_list, struct nbd_device, list);
|
||||
list_del_init(&nbd->list);
|
||||
if (refcount_read(&nbd->config_refs))
|
||||
pr_err("possibly leaking nbd_config (ref %d)\n",
|
||||
refcount_read(&nbd->config_refs));
|
||||
if (refcount_read(&nbd->refs) != 1)
|
||||
printk(KERN_ERR "nbd: possibly leaking a device\n");
|
||||
pr_err("possibly leaking a device\n");
|
||||
nbd_put(nbd);
|
||||
}
|
||||
|
||||
|
|
@ -2546,7 +2569,6 @@ static void __exit nbd_cleanup(void)
|
|||
destroy_workqueue(nbd_del_wq);
|
||||
|
||||
idr_destroy(&nbd_index_idr);
|
||||
genl_unregister_family(&nbd_genl_family);
|
||||
unregister_blkdev(NBD_MAJOR, "nbd");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -77,12 +77,6 @@ enum {
|
|||
NULL_IRQ_TIMER = 2,
|
||||
};
|
||||
|
||||
enum {
|
||||
NULL_Q_BIO = 0,
|
||||
NULL_Q_RQ = 1,
|
||||
NULL_Q_MQ = 2,
|
||||
};
|
||||
|
||||
static bool g_virt_boundary = false;
|
||||
module_param_named(virt_boundary, g_virt_boundary, bool, 0444);
|
||||
MODULE_PARM_DESC(virt_boundary, "Require a virtual boundary for the device. Default: False");
|
||||
|
|
|
|||
|
|
@ -60,6 +60,13 @@ struct nullb_zone {
|
|||
unsigned int capacity;
|
||||
};
|
||||
|
||||
/* Queue modes */
|
||||
enum {
|
||||
NULL_Q_BIO = 0,
|
||||
NULL_Q_RQ = 1,
|
||||
NULL_Q_MQ = 2,
|
||||
};
|
||||
|
||||
struct nullb_device {
|
||||
struct nullb *nullb;
|
||||
struct config_item item;
|
||||
|
|
|
|||
|
|
@ -398,10 +398,10 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
|
|||
*/
|
||||
if (append) {
|
||||
sector = zone->wp;
|
||||
if (cmd->bio)
|
||||
cmd->bio->bi_iter.bi_sector = sector;
|
||||
else
|
||||
if (dev->queue_mode == NULL_Q_MQ)
|
||||
cmd->rq->__sector = sector;
|
||||
else
|
||||
cmd->bio->bi_iter.bi_sector = sector;
|
||||
} else if (sector != zone->wp) {
|
||||
ret = BLK_STS_IOERR;
|
||||
goto unlock;
|
||||
|
|
|
|||
|
|
@ -540,7 +540,7 @@ static int carm_array_info (struct carm_host *host, unsigned int array_idx)
|
|||
spin_unlock_irq(&host->lock);
|
||||
|
||||
DPRINTK("blk_execute_rq_nowait, tag == %u\n", rq->tag);
|
||||
blk_execute_rq_nowait(rq, true, NULL);
|
||||
blk_execute_rq_nowait(rq, true);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -579,7 +579,7 @@ static int carm_send_special (struct carm_host *host, carm_sspc_t func)
|
|||
crq->msg_bucket = (u32) rc;
|
||||
|
||||
DPRINTK("blk_execute_rq_nowait, tag == %u\n", rq->tag);
|
||||
blk_execute_rq_nowait(rq, true, NULL);
|
||||
blk_execute_rq_nowait(rq, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -395,6 +395,13 @@ struct cached_dev {
|
|||
atomic_t io_errors;
|
||||
unsigned int error_limit;
|
||||
unsigned int offline_seconds;
|
||||
|
||||
/*
|
||||
* Retry to update writeback_rate if contention happens for
|
||||
* down_read(dc->writeback_lock) in update_writeback_rate()
|
||||
*/
|
||||
#define BCH_WBRATE_UPDATE_MAX_SKIPS 15
|
||||
unsigned int rate_update_retry;
|
||||
};
|
||||
|
||||
enum alloc_reserve {
|
||||
|
|
|
|||
|
|
@ -2006,8 +2006,7 @@ int bch_btree_check(struct cache_set *c)
|
|||
int i;
|
||||
struct bkey *k = NULL;
|
||||
struct btree_iter iter;
|
||||
struct btree_check_state *check_state;
|
||||
char name[32];
|
||||
struct btree_check_state check_state;
|
||||
|
||||
/* check and mark root node keys */
|
||||
for_each_key_filter(&c->root->keys, k, &iter, bch_ptr_invalid)
|
||||
|
|
@ -2018,63 +2017,59 @@ int bch_btree_check(struct cache_set *c)
|
|||
if (c->root->level == 0)
|
||||
return 0;
|
||||
|
||||
check_state = kzalloc(sizeof(struct btree_check_state), GFP_KERNEL);
|
||||
if (!check_state)
|
||||
return -ENOMEM;
|
||||
|
||||
check_state->c = c;
|
||||
check_state->total_threads = bch_btree_chkthread_nr();
|
||||
check_state->key_idx = 0;
|
||||
spin_lock_init(&check_state->idx_lock);
|
||||
atomic_set(&check_state->started, 0);
|
||||
atomic_set(&check_state->enough, 0);
|
||||
init_waitqueue_head(&check_state->wait);
|
||||
memset(&check_state, 0, sizeof(struct btree_check_state));
|
||||
check_state.c = c;
|
||||
check_state.total_threads = bch_btree_chkthread_nr();
|
||||
check_state.key_idx = 0;
|
||||
spin_lock_init(&check_state.idx_lock);
|
||||
atomic_set(&check_state.started, 0);
|
||||
atomic_set(&check_state.enough, 0);
|
||||
init_waitqueue_head(&check_state.wait);
|
||||
|
||||
rw_lock(0, c->root, c->root->level);
|
||||
/*
|
||||
* Run multiple threads to check btree nodes in parallel,
|
||||
* if check_state->enough is non-zero, it means current
|
||||
* if check_state.enough is non-zero, it means current
|
||||
* running check threads are enough, unncessary to create
|
||||
* more.
|
||||
*/
|
||||
for (i = 0; i < check_state->total_threads; i++) {
|
||||
/* fetch latest check_state->enough earlier */
|
||||
for (i = 0; i < check_state.total_threads; i++) {
|
||||
/* fetch latest check_state.enough earlier */
|
||||
smp_mb__before_atomic();
|
||||
if (atomic_read(&check_state->enough))
|
||||
if (atomic_read(&check_state.enough))
|
||||
break;
|
||||
|
||||
check_state->infos[i].result = 0;
|
||||
check_state->infos[i].state = check_state;
|
||||
snprintf(name, sizeof(name), "bch_btrchk[%u]", i);
|
||||
atomic_inc(&check_state->started);
|
||||
check_state.infos[i].result = 0;
|
||||
check_state.infos[i].state = &check_state;
|
||||
|
||||
check_state->infos[i].thread =
|
||||
check_state.infos[i].thread =
|
||||
kthread_run(bch_btree_check_thread,
|
||||
&check_state->infos[i],
|
||||
name);
|
||||
if (IS_ERR(check_state->infos[i].thread)) {
|
||||
&check_state.infos[i],
|
||||
"bch_btrchk[%d]", i);
|
||||
if (IS_ERR(check_state.infos[i].thread)) {
|
||||
pr_err("fails to run thread bch_btrchk[%d]\n", i);
|
||||
for (--i; i >= 0; i--)
|
||||
kthread_stop(check_state->infos[i].thread);
|
||||
kthread_stop(check_state.infos[i].thread);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
atomic_inc(&check_state.started);
|
||||
}
|
||||
|
||||
/*
|
||||
* Must wait for all threads to stop.
|
||||
*/
|
||||
wait_event_interruptible(check_state->wait,
|
||||
atomic_read(&check_state->started) == 0);
|
||||
wait_event(check_state.wait, atomic_read(&check_state.started) == 0);
|
||||
|
||||
for (i = 0; i < check_state->total_threads; i++) {
|
||||
if (check_state->infos[i].result) {
|
||||
ret = check_state->infos[i].result;
|
||||
for (i = 0; i < check_state.total_threads; i++) {
|
||||
if (check_state.infos[i].result) {
|
||||
ret = check_state.infos[i].result;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
kfree(check_state);
|
||||
rw_unlock(0, c->root);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -226,7 +226,7 @@ struct btree_check_info {
|
|||
int result;
|
||||
};
|
||||
|
||||
#define BCH_BTR_CHKTHREAD_MAX 64
|
||||
#define BCH_BTR_CHKTHREAD_MAX 12
|
||||
struct btree_check_state {
|
||||
struct cache_set *c;
|
||||
int total_threads;
|
||||
|
|
|
|||
|
|
@ -405,6 +405,11 @@ err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
void bch_journal_space_reserve(struct journal *j)
|
||||
{
|
||||
j->do_reserve = true;
|
||||
}
|
||||
|
||||
/* Journalling */
|
||||
|
||||
static void btree_flush_write(struct cache_set *c)
|
||||
|
|
@ -621,12 +626,30 @@ static void do_journal_discard(struct cache *ca)
|
|||
}
|
||||
}
|
||||
|
||||
static unsigned int free_journal_buckets(struct cache_set *c)
|
||||
{
|
||||
struct journal *j = &c->journal;
|
||||
struct cache *ca = c->cache;
|
||||
struct journal_device *ja = &c->cache->journal;
|
||||
unsigned int n;
|
||||
|
||||
/* In case njournal_buckets is not power of 2 */
|
||||
if (ja->cur_idx >= ja->discard_idx)
|
||||
n = ca->sb.njournal_buckets + ja->discard_idx - ja->cur_idx;
|
||||
else
|
||||
n = ja->discard_idx - ja->cur_idx;
|
||||
|
||||
if (n > (1 + j->do_reserve))
|
||||
return n - (1 + j->do_reserve);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void journal_reclaim(struct cache_set *c)
|
||||
{
|
||||
struct bkey *k = &c->journal.key;
|
||||
struct cache *ca = c->cache;
|
||||
uint64_t last_seq;
|
||||
unsigned int next;
|
||||
struct journal_device *ja = &ca->journal;
|
||||
atomic_t p __maybe_unused;
|
||||
|
||||
|
|
@ -649,12 +672,10 @@ static void journal_reclaim(struct cache_set *c)
|
|||
if (c->journal.blocks_free)
|
||||
goto out;
|
||||
|
||||
next = (ja->cur_idx + 1) % ca->sb.njournal_buckets;
|
||||
/* No space available on this device */
|
||||
if (next == ja->discard_idx)
|
||||
if (!free_journal_buckets(c))
|
||||
goto out;
|
||||
|
||||
ja->cur_idx = next;
|
||||
ja->cur_idx = (ja->cur_idx + 1) % ca->sb.njournal_buckets;
|
||||
k->ptr[0] = MAKE_PTR(0,
|
||||
bucket_to_sector(c, ca->sb.d[ja->cur_idx]),
|
||||
ca->sb.nr_this_dev);
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ struct journal {
|
|||
spinlock_t lock;
|
||||
spinlock_t flush_write_lock;
|
||||
bool btree_flushing;
|
||||
bool do_reserve;
|
||||
/* used when waiting because the journal was full */
|
||||
struct closure_waitlist wait;
|
||||
struct closure io;
|
||||
|
|
@ -182,5 +183,6 @@ int bch_journal_replay(struct cache_set *c, struct list_head *list);
|
|||
|
||||
void bch_journal_free(struct cache_set *c);
|
||||
int bch_journal_alloc(struct cache_set *c);
|
||||
void bch_journal_space_reserve(struct journal *j);
|
||||
|
||||
#endif /* _BCACHE_JOURNAL_H */
|
||||
|
|
|
|||
|
|
@ -1105,6 +1105,12 @@ static void detached_dev_do_request(struct bcache_device *d, struct bio *bio,
|
|||
* which would call closure_get(&dc->disk.cl)
|
||||
*/
|
||||
ddip = kzalloc(sizeof(struct detached_dev_io_private), GFP_NOIO);
|
||||
if (!ddip) {
|
||||
bio->bi_status = BLK_STS_RESOURCE;
|
||||
bio->bi_end_io(bio);
|
||||
return;
|
||||
}
|
||||
|
||||
ddip->d = d;
|
||||
/* Count on the bcache device */
|
||||
ddip->orig_bdev = orig_bdev;
|
||||
|
|
|
|||
|
|
@ -2127,6 +2127,7 @@ static int run_cache_set(struct cache_set *c)
|
|||
|
||||
flash_devs_run(c);
|
||||
|
||||
bch_journal_space_reserve(&c->journal);
|
||||
set_bit(CACHE_SET_RUNNING, &c->flags);
|
||||
return 0;
|
||||
err:
|
||||
|
|
|
|||
|
|
@ -235,19 +235,27 @@ static void update_writeback_rate(struct work_struct *work)
|
|||
return;
|
||||
}
|
||||
|
||||
if (atomic_read(&dc->has_dirty) && dc->writeback_percent) {
|
||||
/*
|
||||
* If the whole cache set is idle, set_at_max_writeback_rate()
|
||||
* will set writeback rate to a max number. Then it is
|
||||
* unncessary to update writeback rate for an idle cache set
|
||||
* in maximum writeback rate number(s).
|
||||
*/
|
||||
if (!set_at_max_writeback_rate(c, dc)) {
|
||||
down_read(&dc->writeback_lock);
|
||||
/*
|
||||
* If the whole cache set is idle, set_at_max_writeback_rate()
|
||||
* will set writeback rate to a max number. Then it is
|
||||
* unncessary to update writeback rate for an idle cache set
|
||||
* in maximum writeback rate number(s).
|
||||
*/
|
||||
if (atomic_read(&dc->has_dirty) && dc->writeback_percent &&
|
||||
!set_at_max_writeback_rate(c, dc)) {
|
||||
do {
|
||||
if (!down_read_trylock((&dc->writeback_lock))) {
|
||||
dc->rate_update_retry++;
|
||||
if (dc->rate_update_retry <=
|
||||
BCH_WBRATE_UPDATE_MAX_SKIPS)
|
||||
break;
|
||||
down_read(&dc->writeback_lock);
|
||||
dc->rate_update_retry = 0;
|
||||
}
|
||||
__update_writeback_rate(dc);
|
||||
update_gc_after_writeback(c);
|
||||
up_read(&dc->writeback_lock);
|
||||
}
|
||||
} while (0);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -805,13 +813,11 @@ static int bch_writeback_thread(void *arg)
|
|||
|
||||
/* Init */
|
||||
#define INIT_KEYS_EACH_TIME 500000
|
||||
#define INIT_KEYS_SLEEP_MS 100
|
||||
|
||||
struct sectors_dirty_init {
|
||||
struct btree_op op;
|
||||
unsigned int inode;
|
||||
size_t count;
|
||||
struct bkey start;
|
||||
};
|
||||
|
||||
static int sectors_dirty_init_fn(struct btree_op *_op, struct btree *b,
|
||||
|
|
@ -827,11 +833,8 @@ static int sectors_dirty_init_fn(struct btree_op *_op, struct btree *b,
|
|||
KEY_START(k), KEY_SIZE(k));
|
||||
|
||||
op->count++;
|
||||
if (atomic_read(&b->c->search_inflight) &&
|
||||
!(op->count % INIT_KEYS_EACH_TIME)) {
|
||||
bkey_copy_key(&op->start, k);
|
||||
return -EAGAIN;
|
||||
}
|
||||
if (!(op->count % INIT_KEYS_EACH_TIME))
|
||||
cond_resched();
|
||||
|
||||
return MAP_CONTINUE;
|
||||
}
|
||||
|
|
@ -846,24 +849,16 @@ static int bch_root_node_dirty_init(struct cache_set *c,
|
|||
bch_btree_op_init(&op.op, -1);
|
||||
op.inode = d->id;
|
||||
op.count = 0;
|
||||
op.start = KEY(op.inode, 0, 0);
|
||||
|
||||
do {
|
||||
ret = bcache_btree(map_keys_recurse,
|
||||
k,
|
||||
c->root,
|
||||
&op.op,
|
||||
&op.start,
|
||||
sectors_dirty_init_fn,
|
||||
0);
|
||||
if (ret == -EAGAIN)
|
||||
schedule_timeout_interruptible(
|
||||
msecs_to_jiffies(INIT_KEYS_SLEEP_MS));
|
||||
else if (ret < 0) {
|
||||
pr_warn("sectors dirty init failed, ret=%d!\n", ret);
|
||||
break;
|
||||
}
|
||||
} while (ret == -EAGAIN);
|
||||
ret = bcache_btree(map_keys_recurse,
|
||||
k,
|
||||
c->root,
|
||||
&op.op,
|
||||
&KEY(op.inode, 0, 0),
|
||||
sectors_dirty_init_fn,
|
||||
0);
|
||||
if (ret < 0)
|
||||
pr_warn("sectors dirty init failed, ret=%d!\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -907,7 +902,6 @@ static int bch_dirty_init_thread(void *arg)
|
|||
goto out;
|
||||
}
|
||||
skip_nr--;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
if (p) {
|
||||
|
|
@ -917,7 +911,6 @@ static int bch_dirty_init_thread(void *arg)
|
|||
|
||||
p = NULL;
|
||||
prev_idx = cur_idx;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
out:
|
||||
|
|
@ -948,67 +941,56 @@ void bch_sectors_dirty_init(struct bcache_device *d)
|
|||
struct btree_iter iter;
|
||||
struct sectors_dirty_init op;
|
||||
struct cache_set *c = d->c;
|
||||
struct bch_dirty_init_state *state;
|
||||
char name[32];
|
||||
struct bch_dirty_init_state state;
|
||||
|
||||
/* Just count root keys if no leaf node */
|
||||
rw_lock(0, c->root, c->root->level);
|
||||
if (c->root->level == 0) {
|
||||
bch_btree_op_init(&op.op, -1);
|
||||
op.inode = d->id;
|
||||
op.count = 0;
|
||||
op.start = KEY(op.inode, 0, 0);
|
||||
|
||||
for_each_key_filter(&c->root->keys,
|
||||
k, &iter, bch_ptr_invalid)
|
||||
sectors_dirty_init_fn(&op.op, c->root, k);
|
||||
|
||||
rw_unlock(0, c->root);
|
||||
return;
|
||||
}
|
||||
|
||||
state = kzalloc(sizeof(struct bch_dirty_init_state), GFP_KERNEL);
|
||||
if (!state) {
|
||||
pr_warn("sectors dirty init failed: cannot allocate memory\n");
|
||||
return;
|
||||
}
|
||||
memset(&state, 0, sizeof(struct bch_dirty_init_state));
|
||||
state.c = c;
|
||||
state.d = d;
|
||||
state.total_threads = bch_btre_dirty_init_thread_nr();
|
||||
state.key_idx = 0;
|
||||
spin_lock_init(&state.idx_lock);
|
||||
atomic_set(&state.started, 0);
|
||||
atomic_set(&state.enough, 0);
|
||||
init_waitqueue_head(&state.wait);
|
||||
|
||||
state->c = c;
|
||||
state->d = d;
|
||||
state->total_threads = bch_btre_dirty_init_thread_nr();
|
||||
state->key_idx = 0;
|
||||
spin_lock_init(&state->idx_lock);
|
||||
atomic_set(&state->started, 0);
|
||||
atomic_set(&state->enough, 0);
|
||||
init_waitqueue_head(&state->wait);
|
||||
|
||||
for (i = 0; i < state->total_threads; i++) {
|
||||
/* Fetch latest state->enough earlier */
|
||||
for (i = 0; i < state.total_threads; i++) {
|
||||
/* Fetch latest state.enough earlier */
|
||||
smp_mb__before_atomic();
|
||||
if (atomic_read(&state->enough))
|
||||
if (atomic_read(&state.enough))
|
||||
break;
|
||||
|
||||
state->infos[i].state = state;
|
||||
atomic_inc(&state->started);
|
||||
snprintf(name, sizeof(name), "bch_dirty_init[%d]", i);
|
||||
|
||||
state->infos[i].thread =
|
||||
kthread_run(bch_dirty_init_thread,
|
||||
&state->infos[i],
|
||||
name);
|
||||
if (IS_ERR(state->infos[i].thread)) {
|
||||
state.infos[i].state = &state;
|
||||
state.infos[i].thread =
|
||||
kthread_run(bch_dirty_init_thread, &state.infos[i],
|
||||
"bch_dirtcnt[%d]", i);
|
||||
if (IS_ERR(state.infos[i].thread)) {
|
||||
pr_err("fails to run thread bch_dirty_init[%d]\n", i);
|
||||
for (--i; i >= 0; i--)
|
||||
kthread_stop(state->infos[i].thread);
|
||||
kthread_stop(state.infos[i].thread);
|
||||
goto out;
|
||||
}
|
||||
atomic_inc(&state.started);
|
||||
}
|
||||
|
||||
/*
|
||||
* Must wait for all threads to stop.
|
||||
*/
|
||||
wait_event_interruptible(state->wait,
|
||||
atomic_read(&state->started) == 0);
|
||||
|
||||
out:
|
||||
kfree(state);
|
||||
/* Must wait for all threads to stop. */
|
||||
wait_event(state.wait, atomic_read(&state.started) == 0);
|
||||
rw_unlock(0, c->root);
|
||||
}
|
||||
|
||||
void bch_cached_dev_writeback_init(struct cached_dev *dc)
|
||||
|
|
@ -1032,6 +1014,9 @@ void bch_cached_dev_writeback_init(struct cached_dev *dc)
|
|||
dc->writeback_rate_fp_term_high = 1000;
|
||||
dc->writeback_rate_i_term_inverse = 10000;
|
||||
|
||||
/* For dc->writeback_lock contention in update_writeback_rate() */
|
||||
dc->rate_update_retry = 0;
|
||||
|
||||
WARN_ON(test_and_clear_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags));
|
||||
INIT_DELAYED_WORK(&dc->writeback_rate_update, update_writeback_rate);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
#define BCH_WRITEBACK_FRAGMENT_THRESHOLD_MID 57
|
||||
#define BCH_WRITEBACK_FRAGMENT_THRESHOLD_HIGH 64
|
||||
|
||||
#define BCH_DIRTY_INIT_THRD_MAX 64
|
||||
#define BCH_DIRTY_INIT_THRD_MAX 12
|
||||
/*
|
||||
* 14 (16384ths) is chosen here as something that each backing device
|
||||
* should be a reasonable fraction of the share, and not to blow up
|
||||
|
|
|
|||
|
|
@ -3725,7 +3725,7 @@ static int raid_message(struct dm_target *ti, unsigned int argc, char **argv,
|
|||
if (!strcasecmp(argv[0], "idle") || !strcasecmp(argv[0], "frozen")) {
|
||||
if (mddev->sync_thread) {
|
||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
md_reap_sync_thread(mddev);
|
||||
md_reap_sync_thread(mddev, false);
|
||||
}
|
||||
} else if (decipher_sync_action(mddev, mddev->recovery) != st_idle)
|
||||
return -EBUSY;
|
||||
|
|
|
|||
|
|
@ -206,7 +206,6 @@ static void linear_free(struct mddev *mddev, void *priv)
|
|||
|
||||
static bool linear_make_request(struct mddev *mddev, struct bio *bio)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct dev_info *tmp_dev;
|
||||
sector_t start_sector, end_sector, data_offset;
|
||||
sector_t bio_sector = bio->bi_iter.bi_sector;
|
||||
|
|
@ -256,10 +255,10 @@ static bool linear_make_request(struct mddev *mddev, struct bio *bio)
|
|||
return true;
|
||||
|
||||
out_of_bounds:
|
||||
pr_err("md/linear:%s: make_request: Sector %llu out of bounds on dev %s: %llu sectors, offset %llu\n",
|
||||
pr_err("md/linear:%s: make_request: Sector %llu out of bounds on dev %pg: %llu sectors, offset %llu\n",
|
||||
mdname(mddev),
|
||||
(unsigned long long)bio->bi_iter.bi_sector,
|
||||
bdevname(tmp_dev->rdev->bdev, b),
|
||||
tmp_dev->rdev->bdev,
|
||||
(unsigned long long)tmp_dev->rdev->sectors,
|
||||
(unsigned long long)start_sector);
|
||||
bio_io_error(bio);
|
||||
|
|
|
|||
|
|
@ -87,10 +87,9 @@ static void multipath_end_request(struct bio *bio)
|
|||
/*
|
||||
* oops, IO error:
|
||||
*/
|
||||
char b[BDEVNAME_SIZE];
|
||||
md_error (mp_bh->mddev, rdev);
|
||||
pr_info("multipath: %s: rescheduling sector %llu\n",
|
||||
bdevname(rdev->bdev,b),
|
||||
pr_info("multipath: %pg: rescheduling sector %llu\n",
|
||||
rdev->bdev,
|
||||
(unsigned long long)bio->bi_iter.bi_sector);
|
||||
multipath_reschedule_retry(mp_bh);
|
||||
} else
|
||||
|
|
@ -154,7 +153,6 @@ static void multipath_status(struct seq_file *seq, struct mddev *mddev)
|
|||
static void multipath_error (struct mddev *mddev, struct md_rdev *rdev)
|
||||
{
|
||||
struct mpconf *conf = mddev->private;
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
if (conf->raid_disks - mddev->degraded <= 1) {
|
||||
/*
|
||||
|
|
@ -177,9 +175,9 @@ static void multipath_error (struct mddev *mddev, struct md_rdev *rdev)
|
|||
}
|
||||
set_bit(Faulty, &rdev->flags);
|
||||
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
||||
pr_err("multipath: IO failure on %s, disabling IO path.\n"
|
||||
pr_err("multipath: IO failure on %pg, disabling IO path.\n"
|
||||
"multipath: Operation continuing on %d IO paths.\n",
|
||||
bdevname(rdev->bdev, b),
|
||||
rdev->bdev,
|
||||
conf->raid_disks - mddev->degraded);
|
||||
}
|
||||
|
||||
|
|
@ -197,12 +195,11 @@ static void print_multipath_conf (struct mpconf *conf)
|
|||
conf->raid_disks);
|
||||
|
||||
for (i = 0; i < conf->raid_disks; i++) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
tmp = conf->multipaths + i;
|
||||
if (tmp->rdev)
|
||||
pr_debug(" disk%d, o:%d, dev:%s\n",
|
||||
pr_debug(" disk%d, o:%d, dev:%pg\n",
|
||||
i,!test_bit(Faulty, &tmp->rdev->flags),
|
||||
bdevname(tmp->rdev->bdev,b));
|
||||
tmp->rdev->bdev);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
185
drivers/md/md.c
185
drivers/md/md.c
|
|
@ -1021,8 +1021,6 @@ EXPORT_SYMBOL_GPL(sync_page_io);
|
|||
|
||||
static int read_disk_sb(struct md_rdev *rdev, int size)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
if (rdev->sb_loaded)
|
||||
return 0;
|
||||
|
||||
|
|
@ -1032,8 +1030,8 @@ static int read_disk_sb(struct md_rdev *rdev, int size)
|
|||
return 0;
|
||||
|
||||
fail:
|
||||
pr_err("md: disabled device %s, could not read superblock.\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_err("md: disabled device %pg, could not read superblock.\n",
|
||||
rdev->bdev);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -1179,7 +1177,6 @@ EXPORT_SYMBOL(md_check_no_bitmap);
|
|||
*/
|
||||
static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version)
|
||||
{
|
||||
char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
|
||||
mdp_super_t *sb;
|
||||
int ret;
|
||||
bool spare_disk = true;
|
||||
|
|
@ -1198,19 +1195,19 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor
|
|||
|
||||
ret = -EINVAL;
|
||||
|
||||
bdevname(rdev->bdev, b);
|
||||
sb = page_address(rdev->sb_page);
|
||||
|
||||
if (sb->md_magic != MD_SB_MAGIC) {
|
||||
pr_warn("md: invalid raid superblock magic on %s\n", b);
|
||||
pr_warn("md: invalid raid superblock magic on %pg\n",
|
||||
rdev->bdev);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
if (sb->major_version != 0 ||
|
||||
sb->minor_version < 90 ||
|
||||
sb->minor_version > 91) {
|
||||
pr_warn("Bad version number %d.%d on %s\n",
|
||||
sb->major_version, sb->minor_version, b);
|
||||
pr_warn("Bad version number %d.%d on %pg\n",
|
||||
sb->major_version, sb->minor_version, rdev->bdev);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
|
|
@ -1218,7 +1215,7 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor
|
|||
goto abort;
|
||||
|
||||
if (md_csum_fold(calc_sb_csum(sb)) != md_csum_fold(sb->sb_csum)) {
|
||||
pr_warn("md: invalid superblock checksum on %s\n", b);
|
||||
pr_warn("md: invalid superblock checksum on %pg\n", rdev->bdev);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
|
|
@ -1250,13 +1247,13 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor
|
|||
__u64 ev1, ev2;
|
||||
mdp_super_t *refsb = page_address(refdev->sb_page);
|
||||
if (!md_uuid_equal(refsb, sb)) {
|
||||
pr_warn("md: %s has different UUID to %s\n",
|
||||
b, bdevname(refdev->bdev,b2));
|
||||
pr_warn("md: %pg has different UUID to %pg\n",
|
||||
rdev->bdev, refdev->bdev);
|
||||
goto abort;
|
||||
}
|
||||
if (!md_sb_equal(refsb, sb)) {
|
||||
pr_warn("md: %s has same UUID but different superblock to %s\n",
|
||||
b, bdevname(refdev->bdev, b2));
|
||||
pr_warn("md: %pg has same UUID but different superblock to %pg\n",
|
||||
rdev->bdev, refdev->bdev);
|
||||
goto abort;
|
||||
}
|
||||
ev1 = md_event(sb);
|
||||
|
|
@ -1620,7 +1617,6 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
|
|||
int ret;
|
||||
sector_t sb_start;
|
||||
sector_t sectors;
|
||||
char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
|
||||
int bmask;
|
||||
bool spare_disk = true;
|
||||
|
||||
|
|
@ -1664,13 +1660,13 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
|
|||
return -EINVAL;
|
||||
|
||||
if (calc_sb_1_csum(sb) != sb->sb_csum) {
|
||||
pr_warn("md: invalid superblock checksum on %s\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_warn("md: invalid superblock checksum on %pg\n",
|
||||
rdev->bdev);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (le64_to_cpu(sb->data_size) < 10) {
|
||||
pr_warn("md: data_size too small on %s\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_warn("md: data_size too small on %pg\n",
|
||||
rdev->bdev);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (sb->pad0 ||
|
||||
|
|
@ -1776,9 +1772,9 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
|
|||
sb->level != refsb->level ||
|
||||
sb->layout != refsb->layout ||
|
||||
sb->chunksize != refsb->chunksize) {
|
||||
pr_warn("md: %s has strangely different superblock to %s\n",
|
||||
bdevname(rdev->bdev,b),
|
||||
bdevname(refdev->bdev,b2));
|
||||
pr_warn("md: %pg has strangely different superblock to %pg\n",
|
||||
rdev->bdev,
|
||||
refdev->bdev);
|
||||
return -EINVAL;
|
||||
}
|
||||
ev1 = le64_to_cpu(sb->events);
|
||||
|
|
@ -2365,7 +2361,6 @@ EXPORT_SYMBOL(md_integrity_register);
|
|||
int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
|
||||
{
|
||||
struct blk_integrity *bi_mddev;
|
||||
char name[BDEVNAME_SIZE];
|
||||
|
||||
if (!mddev->gendisk)
|
||||
return 0;
|
||||
|
|
@ -2376,8 +2371,8 @@ int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
|
|||
return 0;
|
||||
|
||||
if (blk_integrity_compare(mddev->gendisk, rdev->bdev->bd_disk) != 0) {
|
||||
pr_err("%s: incompatible integrity profile for %s\n",
|
||||
mdname(mddev), bdevname(rdev->bdev, name));
|
||||
pr_err("%s: incompatible integrity profile for %pg\n",
|
||||
mdname(mddev), rdev->bdev);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
|
|
@ -2486,11 +2481,9 @@ static void rdev_delayed_delete(struct work_struct *ws)
|
|||
|
||||
static void unbind_rdev_from_array(struct md_rdev *rdev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk);
|
||||
list_del_rcu(&rdev->same_set);
|
||||
pr_debug("md: unbind<%s>\n", bdevname(rdev->bdev,b));
|
||||
pr_debug("md: unbind<%pg>\n", rdev->bdev);
|
||||
mddev_destroy_serial_pool(rdev->mddev, rdev, false);
|
||||
rdev->mddev = NULL;
|
||||
sysfs_remove_link(&rdev->kobj, "block");
|
||||
|
|
@ -2543,9 +2536,7 @@ void md_autodetect_dev(dev_t dev);
|
|||
|
||||
static void export_rdev(struct md_rdev *rdev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
pr_debug("md: export_rdev(%s)\n", bdevname(rdev->bdev,b));
|
||||
pr_debug("md: export_rdev(%pg)\n", rdev->bdev);
|
||||
md_rdev_clear(rdev);
|
||||
#ifndef MODULE
|
||||
if (test_bit(AutoDetected, &rdev->flags))
|
||||
|
|
@ -2803,8 +2794,6 @@ repeat:
|
|||
rewrite:
|
||||
md_bitmap_update_sb(mddev->bitmap);
|
||||
rdev_for_each(rdev, mddev) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
if (rdev->sb_loaded != 1)
|
||||
continue; /* no noise on spare devices */
|
||||
|
||||
|
|
@ -2812,8 +2801,8 @@ rewrite:
|
|||
md_super_write(mddev,rdev,
|
||||
rdev->sb_start, rdev->sb_size,
|
||||
rdev->sb_page);
|
||||
pr_debug("md: (write) %s's sb offset: %llu\n",
|
||||
bdevname(rdev->bdev, b),
|
||||
pr_debug("md: (write) %pg's sb offset: %llu\n",
|
||||
rdev->bdev,
|
||||
(unsigned long long)rdev->sb_start);
|
||||
rdev->sb_events = mddev->events;
|
||||
if (rdev->badblocks.size) {
|
||||
|
|
@ -2825,8 +2814,8 @@ rewrite:
|
|||
}
|
||||
|
||||
} else
|
||||
pr_debug("md: %s (skipping faulty)\n",
|
||||
bdevname(rdev->bdev, b));
|
||||
pr_debug("md: %pg (skipping faulty)\n",
|
||||
rdev->bdev);
|
||||
|
||||
if (mddev->level == LEVEL_MULTIPATH)
|
||||
/* only need to write one superblock... */
|
||||
|
|
@ -3701,7 +3690,6 @@ EXPORT_SYMBOL_GPL(md_rdev_init);
|
|||
*/
|
||||
static struct md_rdev *md_import_device(dev_t newdev, int super_format, int super_minor)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
int err;
|
||||
struct md_rdev *rdev;
|
||||
sector_t size;
|
||||
|
|
@ -3725,8 +3713,8 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe
|
|||
|
||||
size = bdev_nr_bytes(rdev->bdev) >> BLOCK_SIZE_BITS;
|
||||
if (!size) {
|
||||
pr_warn("md: %s has zero or unknown size, marking faulty!\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_warn("md: %pg has zero or unknown size, marking faulty!\n",
|
||||
rdev->bdev);
|
||||
err = -EINVAL;
|
||||
goto abort_free;
|
||||
}
|
||||
|
|
@ -3735,14 +3723,14 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe
|
|||
err = super_types[super_format].
|
||||
load_super(rdev, NULL, super_minor);
|
||||
if (err == -EINVAL) {
|
||||
pr_warn("md: %s does not have a valid v%d.%d superblock, not importing!\n",
|
||||
bdevname(rdev->bdev,b),
|
||||
pr_warn("md: %pg does not have a valid v%d.%d superblock, not importing!\n",
|
||||
rdev->bdev,
|
||||
super_format, super_minor);
|
||||
goto abort_free;
|
||||
}
|
||||
if (err < 0) {
|
||||
pr_warn("md: could not read %s's sb, not importing!\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_warn("md: could not read %pg's sb, not importing!\n",
|
||||
rdev->bdev);
|
||||
goto abort_free;
|
||||
}
|
||||
}
|
||||
|
|
@ -3765,7 +3753,6 @@ static int analyze_sbs(struct mddev *mddev)
|
|||
{
|
||||
int i;
|
||||
struct md_rdev *rdev, *freshest, *tmp;
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
freshest = NULL;
|
||||
rdev_for_each_safe(rdev, tmp, mddev)
|
||||
|
|
@ -3777,8 +3764,8 @@ static int analyze_sbs(struct mddev *mddev)
|
|||
case 0:
|
||||
break;
|
||||
default:
|
||||
pr_warn("md: fatal superblock inconsistency in %s -- removing from array\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_warn("md: fatal superblock inconsistency in %pg -- removing from array\n",
|
||||
rdev->bdev);
|
||||
md_kick_rdev_from_array(rdev);
|
||||
}
|
||||
|
||||
|
|
@ -3796,8 +3783,8 @@ static int analyze_sbs(struct mddev *mddev)
|
|||
if (mddev->max_disks &&
|
||||
(rdev->desc_nr >= mddev->max_disks ||
|
||||
i > mddev->max_disks)) {
|
||||
pr_warn("md: %s: %s: only %d devices permitted\n",
|
||||
mdname(mddev), bdevname(rdev->bdev, b),
|
||||
pr_warn("md: %s: %pg: only %d devices permitted\n",
|
||||
mdname(mddev), rdev->bdev,
|
||||
mddev->max_disks);
|
||||
md_kick_rdev_from_array(rdev);
|
||||
continue;
|
||||
|
|
@ -3805,8 +3792,8 @@ static int analyze_sbs(struct mddev *mddev)
|
|||
if (rdev != freshest) {
|
||||
if (super_types[mddev->major_version].
|
||||
validate_super(mddev, rdev)) {
|
||||
pr_warn("md: kicking non-fresh %s from array!\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_warn("md: kicking non-fresh %pg from array!\n",
|
||||
rdev->bdev);
|
||||
md_kick_rdev_from_array(rdev);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -4844,7 +4831,7 @@ action_store(struct mddev *mddev, const char *page, size_t len)
|
|||
flush_workqueue(md_misc_wq);
|
||||
if (mddev->sync_thread) {
|
||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
md_reap_sync_thread(mddev);
|
||||
md_reap_sync_thread(mddev, true);
|
||||
}
|
||||
mddev_unlock(mddev);
|
||||
}
|
||||
|
|
@ -5598,8 +5585,6 @@ static void md_free(struct kobject *ko)
|
|||
|
||||
bioset_exit(&mddev->bio_set);
|
||||
bioset_exit(&mddev->sync_set);
|
||||
if (mddev->level != 1 && mddev->level != 10)
|
||||
bioset_exit(&mddev->io_acct_set);
|
||||
kfree(mddev);
|
||||
}
|
||||
|
||||
|
|
@ -5912,7 +5897,6 @@ int md_run(struct mddev *mddev)
|
|||
/* Warn if this is a potentially silly
|
||||
* configuration.
|
||||
*/
|
||||
char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
|
||||
struct md_rdev *rdev2;
|
||||
int warned = 0;
|
||||
|
||||
|
|
@ -5921,10 +5905,10 @@ int md_run(struct mddev *mddev)
|
|||
if (rdev < rdev2 &&
|
||||
rdev->bdev->bd_disk ==
|
||||
rdev2->bdev->bd_disk) {
|
||||
pr_warn("%s: WARNING: %s appears to be on the same physical disk as %s.\n",
|
||||
pr_warn("%s: WARNING: %pg appears to be on the same physical disk as %pg.\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev->bdev,b),
|
||||
bdevname(rdev2->bdev,b2));
|
||||
rdev->bdev,
|
||||
rdev2->bdev);
|
||||
warned = 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -6213,7 +6197,7 @@ static void __md_stop_writes(struct mddev *mddev)
|
|||
flush_workqueue(md_misc_wq);
|
||||
if (mddev->sync_thread) {
|
||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
md_reap_sync_thread(mddev);
|
||||
md_reap_sync_thread(mddev, true);
|
||||
}
|
||||
|
||||
del_timer_sync(&mddev->safemode_timer);
|
||||
|
|
@ -6285,8 +6269,6 @@ void md_stop(struct mddev *mddev)
|
|||
__md_stop(mddev);
|
||||
bioset_exit(&mddev->bio_set);
|
||||
bioset_exit(&mddev->sync_set);
|
||||
if (mddev->level != 1 && mddev->level != 10)
|
||||
bioset_exit(&mddev->io_acct_set);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(md_stop);
|
||||
|
|
@ -6452,8 +6434,7 @@ static void autorun_array(struct mddev *mddev)
|
|||
pr_info("md: running: ");
|
||||
|
||||
rdev_for_each(rdev, mddev) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
pr_cont("<%s>", bdevname(rdev->bdev,b));
|
||||
pr_cont("<%pg>", rdev->bdev);
|
||||
}
|
||||
pr_cont("\n");
|
||||
|
||||
|
|
@ -6480,7 +6461,6 @@ static void autorun_devices(int part)
|
|||
{
|
||||
struct md_rdev *rdev0, *rdev, *tmp;
|
||||
struct mddev *mddev;
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
pr_info("md: autorun ...\n");
|
||||
while (!list_empty(&pending_raid_disks)) {
|
||||
|
|
@ -6490,12 +6470,12 @@ static void autorun_devices(int part)
|
|||
rdev0 = list_entry(pending_raid_disks.next,
|
||||
struct md_rdev, same_set);
|
||||
|
||||
pr_debug("md: considering %s ...\n", bdevname(rdev0->bdev,b));
|
||||
pr_debug("md: considering %pg ...\n", rdev0->bdev);
|
||||
INIT_LIST_HEAD(&candidates);
|
||||
rdev_for_each_list(rdev, tmp, &pending_raid_disks)
|
||||
if (super_90_load(rdev, rdev0, 0) >= 0) {
|
||||
pr_debug("md: adding %s ...\n",
|
||||
bdevname(rdev->bdev,b));
|
||||
pr_debug("md: adding %pg ...\n",
|
||||
rdev->bdev);
|
||||
list_move(&rdev->same_set, &candidates);
|
||||
}
|
||||
/*
|
||||
|
|
@ -6512,8 +6492,8 @@ static void autorun_devices(int part)
|
|||
unit = MINOR(dev);
|
||||
}
|
||||
if (rdev0->preferred_minor != unit) {
|
||||
pr_warn("md: unit number in %s is bad: %d\n",
|
||||
bdevname(rdev0->bdev, b), rdev0->preferred_minor);
|
||||
pr_warn("md: unit number in %pg is bad: %d\n",
|
||||
rdev0->bdev, rdev0->preferred_minor);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -6526,8 +6506,8 @@ static void autorun_devices(int part)
|
|||
pr_warn("md: %s locked, cannot run\n", mdname(mddev));
|
||||
else if (mddev->raid_disks || mddev->major_version
|
||||
|| !list_empty(&mddev->disks)) {
|
||||
pr_warn("md: %s already running, cannot run %s\n",
|
||||
mdname(mddev), bdevname(rdev0->bdev,b));
|
||||
pr_warn("md: %s already running, cannot run %pg\n",
|
||||
mdname(mddev), rdev0->bdev);
|
||||
mddev_unlock(mddev);
|
||||
} else {
|
||||
pr_debug("md: created %s\n", mdname(mddev));
|
||||
|
|
@ -6701,7 +6681,6 @@ static int get_disk_info(struct mddev *mddev, void __user * arg)
|
|||
|
||||
int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info)
|
||||
{
|
||||
char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
|
||||
struct md_rdev *rdev;
|
||||
dev_t dev = MKDEV(info->major,info->minor);
|
||||
|
||||
|
|
@ -6731,9 +6710,9 @@ int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info)
|
|||
err = super_types[mddev->major_version]
|
||||
.load_super(rdev, rdev0, mddev->minor_version);
|
||||
if (err < 0) {
|
||||
pr_warn("md: %s has different UUID to %s\n",
|
||||
bdevname(rdev->bdev,b),
|
||||
bdevname(rdev0->bdev,b2));
|
||||
pr_warn("md: %pg has different UUID to %pg\n",
|
||||
rdev->bdev,
|
||||
rdev0->bdev);
|
||||
export_rdev(rdev);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -6908,7 +6887,6 @@ int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info)
|
|||
|
||||
static int hot_remove_disk(struct mddev *mddev, dev_t dev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct md_rdev *rdev;
|
||||
|
||||
if (!mddev->pers)
|
||||
|
|
@ -6943,14 +6921,13 @@ kick_rdev:
|
|||
|
||||
return 0;
|
||||
busy:
|
||||
pr_debug("md: cannot remove active disk %s from %s ...\n",
|
||||
bdevname(rdev->bdev,b), mdname(mddev));
|
||||
pr_debug("md: cannot remove active disk %pg from %s ...\n",
|
||||
rdev->bdev, mdname(mddev));
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static int hot_add_disk(struct mddev *mddev, dev_t dev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
int err;
|
||||
struct md_rdev *rdev;
|
||||
|
||||
|
|
@ -6983,8 +6960,8 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)
|
|||
rdev->sectors = rdev->sb_start;
|
||||
|
||||
if (test_bit(Faulty, &rdev->flags)) {
|
||||
pr_warn("md: can not hot-add faulty %s disk to %s!\n",
|
||||
bdevname(rdev->bdev,b), mdname(mddev));
|
||||
pr_warn("md: can not hot-add faulty %pg disk to %s!\n",
|
||||
rdev->bdev, mdname(mddev));
|
||||
err = -EINVAL;
|
||||
goto abort_export;
|
||||
}
|
||||
|
|
@ -7011,8 +6988,8 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)
|
|||
* disable on the whole MD.
|
||||
*/
|
||||
if (!blk_queue_nowait(bdev_get_queue(rdev->bdev))) {
|
||||
pr_info("%s: Disabling nowait because %s does not support nowait\n",
|
||||
mdname(mddev), bdevname(rdev->bdev, b));
|
||||
pr_info("%s: Disabling nowait because %pg does not support nowait\n",
|
||||
mdname(mddev), rdev->bdev);
|
||||
blk_queue_flag_clear(QUEUE_FLAG_NOWAIT, mddev->queue);
|
||||
}
|
||||
/*
|
||||
|
|
@ -7963,17 +7940,22 @@ EXPORT_SYMBOL(md_register_thread);
|
|||
|
||||
void md_unregister_thread(struct md_thread **threadp)
|
||||
{
|
||||
struct md_thread *thread = *threadp;
|
||||
if (!thread)
|
||||
return;
|
||||
pr_debug("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));
|
||||
/* Locking ensures that mddev_unlock does not wake_up a
|
||||
struct md_thread *thread;
|
||||
|
||||
/*
|
||||
* Locking ensures that mddev_unlock does not wake_up a
|
||||
* non-existent thread
|
||||
*/
|
||||
spin_lock(&pers_lock);
|
||||
thread = *threadp;
|
||||
if (!thread) {
|
||||
spin_unlock(&pers_lock);
|
||||
return;
|
||||
}
|
||||
*threadp = NULL;
|
||||
spin_unlock(&pers_lock);
|
||||
|
||||
pr_debug("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));
|
||||
kthread_stop(thread->tsk);
|
||||
kfree(thread);
|
||||
}
|
||||
|
|
@ -8012,10 +7994,8 @@ static void status_unused(struct seq_file *seq)
|
|||
seq_printf(seq, "unused devices: ");
|
||||
|
||||
list_for_each_entry(rdev, &pending_raid_disks, same_set) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
i++;
|
||||
seq_printf(seq, "%s ",
|
||||
bdevname(rdev->bdev,b));
|
||||
seq_printf(seq, "%pg ", rdev->bdev);
|
||||
}
|
||||
if (!i)
|
||||
seq_printf(seq, "<none>");
|
||||
|
|
@ -8255,9 +8235,8 @@ static int md_seq_show(struct seq_file *seq, void *v)
|
|||
sectors = 0;
|
||||
rcu_read_lock();
|
||||
rdev_for_each_rcu(rdev, mddev) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
seq_printf(seq, " %s[%d]",
|
||||
bdevname(rdev->bdev,b), rdev->desc_nr);
|
||||
seq_printf(seq, " %pg[%d]", rdev->bdev, rdev->desc_nr);
|
||||
|
||||
if (test_bit(WriteMostly, &rdev->flags))
|
||||
seq_printf(seq, "(W)");
|
||||
if (test_bit(Journal, &rdev->flags))
|
||||
|
|
@ -9324,7 +9303,7 @@ void md_check_recovery(struct mddev *mddev)
|
|||
* ->spare_active and clear saved_raid_disk
|
||||
*/
|
||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
md_reap_sync_thread(mddev);
|
||||
md_reap_sync_thread(mddev, true);
|
||||
clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
|
||||
clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
|
||||
clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
|
||||
|
|
@ -9359,7 +9338,7 @@ void md_check_recovery(struct mddev *mddev)
|
|||
goto unlock;
|
||||
}
|
||||
if (mddev->sync_thread) {
|
||||
md_reap_sync_thread(mddev);
|
||||
md_reap_sync_thread(mddev, true);
|
||||
goto unlock;
|
||||
}
|
||||
/* Set RUNNING before clearing NEEDED to avoid
|
||||
|
|
@ -9432,14 +9411,18 @@ void md_check_recovery(struct mddev *mddev)
|
|||
}
|
||||
EXPORT_SYMBOL(md_check_recovery);
|
||||
|
||||
void md_reap_sync_thread(struct mddev *mddev)
|
||||
void md_reap_sync_thread(struct mddev *mddev, bool reconfig_mutex_held)
|
||||
{
|
||||
struct md_rdev *rdev;
|
||||
sector_t old_dev_sectors = mddev->dev_sectors;
|
||||
bool is_reshaped = false;
|
||||
|
||||
if (reconfig_mutex_held)
|
||||
mddev_unlock(mddev);
|
||||
/* resync has finished, collect result */
|
||||
md_unregister_thread(&mddev->sync_thread);
|
||||
if (reconfig_mutex_held)
|
||||
mddev_lock_nointr(mddev);
|
||||
if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
|
||||
!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
|
||||
mddev->degraded != mddev->raid_disks) {
|
||||
|
|
@ -9652,7 +9635,6 @@ static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
|
|||
struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
|
||||
struct md_rdev *rdev2, *tmp;
|
||||
int role, ret;
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
/*
|
||||
* If size is changed in another node then we need to
|
||||
|
|
@ -9676,7 +9658,8 @@ static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
|
|||
|
||||
if (test_bit(Candidate, &rdev2->flags)) {
|
||||
if (role == MD_DISK_ROLE_FAULTY) {
|
||||
pr_info("md: Removing Candidate device %s because add failed\n", bdevname(rdev2->bdev,b));
|
||||
pr_info("md: Removing Candidate device %pg because add failed\n",
|
||||
rdev2->bdev);
|
||||
md_kick_rdev_from_array(rdev2);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -9693,8 +9676,8 @@ static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
|
|||
MD_FEATURE_RESHAPE_ACTIVE)) {
|
||||
rdev2->saved_raid_disk = role;
|
||||
ret = remove_and_add_spares(mddev, rdev2);
|
||||
pr_info("Activated spare: %s\n",
|
||||
bdevname(rdev2->bdev,b));
|
||||
pr_info("Activated spare: %pg\n",
|
||||
rdev2->bdev);
|
||||
/* wakeup mddev->thread here, so array could
|
||||
* perform resync with the new activated disk */
|
||||
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
|
||||
|
|
|
|||
|
|
@ -719,7 +719,7 @@ extern struct md_thread *md_register_thread(
|
|||
extern void md_unregister_thread(struct md_thread **threadp);
|
||||
extern void md_wakeup_thread(struct md_thread *thread);
|
||||
extern void md_check_recovery(struct mddev *mddev);
|
||||
extern void md_reap_sync_thread(struct mddev *mddev);
|
||||
extern void md_reap_sync_thread(struct mddev *mddev, bool reconfig_mutex_held);
|
||||
extern int mddev_init_writes_pending(struct mddev *mddev);
|
||||
extern bool md_write_start(struct mddev *mddev, struct bio *bi);
|
||||
extern void md_write_inc(struct mddev *mddev, struct bio *bi);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ static void dump_zones(struct mddev *mddev)
|
|||
int j, k;
|
||||
sector_t zone_size = 0;
|
||||
sector_t zone_start = 0;
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct r0conf *conf = mddev->private;
|
||||
int raid_disks = conf->strip_zone[0].nb_dev;
|
||||
pr_debug("md: RAID0 configuration for %s - %d zone%s\n",
|
||||
|
|
@ -48,9 +47,8 @@ static void dump_zones(struct mddev *mddev)
|
|||
int len = 0;
|
||||
|
||||
for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
|
||||
len += snprintf(line+len, 200-len, "%s%s", k?"/":"",
|
||||
bdevname(conf->devlist[j*raid_disks
|
||||
+ k]->bdev, b));
|
||||
len += snprintf(line+len, 200-len, "%s%pg", k?"/":"",
|
||||
conf->devlist[j * raid_disks + k]->bdev);
|
||||
pr_debug("md: zone%d=[%s]\n", j, line);
|
||||
|
||||
zone_size = conf->strip_zone[j].zone_end - zone_start;
|
||||
|
|
@ -69,8 +67,6 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||
struct md_rdev *smallest, *rdev1, *rdev2, *rdev, **dev;
|
||||
struct strip_zone *zone;
|
||||
int cnt;
|
||||
char b[BDEVNAME_SIZE];
|
||||
char b2[BDEVNAME_SIZE];
|
||||
struct r0conf *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
|
||||
unsigned blksize = 512;
|
||||
|
||||
|
|
@ -78,9 +74,9 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||
if (!conf)
|
||||
return -ENOMEM;
|
||||
rdev_for_each(rdev1, mddev) {
|
||||
pr_debug("md/raid0:%s: looking at %s\n",
|
||||
pr_debug("md/raid0:%s: looking at %pg\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev1->bdev, b));
|
||||
rdev1->bdev);
|
||||
c = 0;
|
||||
|
||||
/* round size to chunk_size */
|
||||
|
|
@ -92,12 +88,12 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||
rdev1->bdev->bd_disk->queue));
|
||||
|
||||
rdev_for_each(rdev2, mddev) {
|
||||
pr_debug("md/raid0:%s: comparing %s(%llu)"
|
||||
" with %s(%llu)\n",
|
||||
pr_debug("md/raid0:%s: comparing %pg(%llu)"
|
||||
" with %pg(%llu)\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev1->bdev,b),
|
||||
rdev1->bdev,
|
||||
(unsigned long long)rdev1->sectors,
|
||||
bdevname(rdev2->bdev,b2),
|
||||
rdev2->bdev,
|
||||
(unsigned long long)rdev2->sectors);
|
||||
if (rdev2 == rdev1) {
|
||||
pr_debug("md/raid0:%s: END\n",
|
||||
|
|
@ -225,15 +221,15 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
|
|||
for (j=0; j<cnt; j++) {
|
||||
rdev = conf->devlist[j];
|
||||
if (rdev->sectors <= zone->dev_start) {
|
||||
pr_debug("md/raid0:%s: checking %s ... nope\n",
|
||||
pr_debug("md/raid0:%s: checking %pg ... nope\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
continue;
|
||||
}
|
||||
pr_debug("md/raid0:%s: checking %s ..."
|
||||
pr_debug("md/raid0:%s: checking %pg ..."
|
||||
" contained as device %d\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev->bdev, b), c);
|
||||
rdev->bdev, c);
|
||||
dev[c] = rdev;
|
||||
c++;
|
||||
if (!smallest || rdev->sectors < smallest->sectors) {
|
||||
|
|
@ -362,7 +358,6 @@ static void free_conf(struct mddev *mddev, struct r0conf *conf)
|
|||
kfree(conf->strip_zone);
|
||||
kfree(conf->devlist);
|
||||
kfree(conf);
|
||||
mddev->private = NULL;
|
||||
}
|
||||
|
||||
static void raid0_free(struct mddev *mddev, void *priv)
|
||||
|
|
|
|||
|
|
@ -402,10 +402,9 @@ static void raid1_end_read_request(struct bio *bio)
|
|||
/*
|
||||
* oops, read error:
|
||||
*/
|
||||
char b[BDEVNAME_SIZE];
|
||||
pr_err_ratelimited("md/raid1:%s: %s: rescheduling sector %llu\n",
|
||||
pr_err_ratelimited("md/raid1:%s: %pg: rescheduling sector %llu\n",
|
||||
mdname(conf->mddev),
|
||||
bdevname(rdev->bdev, b),
|
||||
rdev->bdev,
|
||||
(unsigned long long)r1_bio->sector);
|
||||
set_bit(R1BIO_ReadError, &r1_bio->state);
|
||||
reschedule_retry(r1_bio);
|
||||
|
|
@ -1283,10 +1282,10 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
|
|||
mirror = conf->mirrors + rdisk;
|
||||
|
||||
if (r1bio_existed)
|
||||
pr_info_ratelimited("md/raid1:%s: redirecting sector %llu to other mirror: %s\n",
|
||||
pr_info_ratelimited("md/raid1:%s: redirecting sector %llu to other mirror: %pg\n",
|
||||
mdname(mddev),
|
||||
(unsigned long long)r1_bio->sector,
|
||||
bdevname(mirror->rdev->bdev, b));
|
||||
mirror->rdev->bdev);
|
||||
|
||||
if (test_bit(WriteMostly, &mirror->rdev->flags) &&
|
||||
bitmap) {
|
||||
|
|
@ -1659,7 +1658,6 @@ static void raid1_status(struct seq_file *seq, struct mddev *mddev)
|
|||
*/
|
||||
static void raid1_error(struct mddev *mddev, struct md_rdev *rdev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct r1conf *conf = mddev->private;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -1686,9 +1684,9 @@ static void raid1_error(struct mddev *mddev, struct md_rdev *rdev)
|
|||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
set_mask_bits(&mddev->sb_flags, 0,
|
||||
BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_PENDING));
|
||||
pr_crit("md/raid1:%s: Disk failure on %s, disabling device.\n"
|
||||
pr_crit("md/raid1:%s: Disk failure on %pg, disabling device.\n"
|
||||
"md/raid1:%s: Operation continuing on %d devices.\n",
|
||||
mdname(mddev), bdevname(rdev->bdev, b),
|
||||
mdname(mddev), rdev->bdev,
|
||||
mdname(mddev), conf->raid_disks - mddev->degraded);
|
||||
}
|
||||
|
||||
|
|
@ -1706,13 +1704,12 @@ static void print_conf(struct r1conf *conf)
|
|||
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < conf->raid_disks; i++) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
|
||||
if (rdev)
|
||||
pr_debug(" disk %d, wo:%d, o:%d, dev:%s\n",
|
||||
pr_debug(" disk %d, wo:%d, o:%d, dev:%pg\n",
|
||||
i, !test_bit(In_sync, &rdev->flags),
|
||||
!test_bit(Faulty, &rdev->flags),
|
||||
bdevname(rdev->bdev,b));
|
||||
rdev->bdev);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
|
@ -2347,7 +2344,6 @@ static void fix_read_error(struct r1conf *conf, int read_disk,
|
|||
}
|
||||
d = start;
|
||||
while (d != read_disk) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
if (d==0)
|
||||
d = conf->raid_disks * 2;
|
||||
d--;
|
||||
|
|
@ -2360,11 +2356,11 @@ static void fix_read_error(struct r1conf *conf, int read_disk,
|
|||
if (r1_sync_page_io(rdev, sect, s,
|
||||
conf->tmppage, READ)) {
|
||||
atomic_add(s, &rdev->corrected_errors);
|
||||
pr_info("md/raid1:%s: read error corrected (%d sectors at %llu on %s)\n",
|
||||
pr_info("md/raid1:%s: read error corrected (%d sectors at %llu on %pg)\n",
|
||||
mdname(mddev), s,
|
||||
(unsigned long long)(sect +
|
||||
rdev->data_offset),
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
}
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
} else
|
||||
|
|
|
|||
|
|
@ -397,10 +397,9 @@ static void raid10_end_read_request(struct bio *bio)
|
|||
/*
|
||||
* oops, read error - keep the refcount on the rdev
|
||||
*/
|
||||
char b[BDEVNAME_SIZE];
|
||||
pr_err_ratelimited("md/raid10:%s: %s: rescheduling sector %llu\n",
|
||||
pr_err_ratelimited("md/raid10:%s: %pg: rescheduling sector %llu\n",
|
||||
mdname(conf->mddev),
|
||||
bdevname(rdev->bdev, b),
|
||||
rdev->bdev,
|
||||
(unsigned long long)r10_bio->sector);
|
||||
set_bit(R10BIO_ReadError, &r10_bio->state);
|
||||
reschedule_retry(r10_bio);
|
||||
|
|
@ -1187,9 +1186,9 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
|
|||
return;
|
||||
}
|
||||
if (err_rdev)
|
||||
pr_err_ratelimited("md/raid10:%s: %s: redirecting sector %llu to another mirror\n",
|
||||
pr_err_ratelimited("md/raid10:%s: %pg: redirecting sector %llu to another mirror\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev->bdev, b),
|
||||
rdev->bdev,
|
||||
(unsigned long long)r10_bio->sector);
|
||||
if (max_sectors < bio_sectors(bio)) {
|
||||
struct bio *split = bio_split(bio, max_sectors,
|
||||
|
|
@ -1987,7 +1986,6 @@ static int enough(struct r10conf *conf, int ignore)
|
|||
*/
|
||||
static void raid10_error(struct mddev *mddev, struct md_rdev *rdev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct r10conf *conf = mddev->private;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -2010,9 +2008,9 @@ static void raid10_error(struct mddev *mddev, struct md_rdev *rdev)
|
|||
set_mask_bits(&mddev->sb_flags, 0,
|
||||
BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_PENDING));
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
pr_crit("md/raid10:%s: Disk failure on %s, disabling device.\n"
|
||||
pr_crit("md/raid10:%s: Disk failure on %pg, disabling device.\n"
|
||||
"md/raid10:%s: Operation continuing on %d devices.\n",
|
||||
mdname(mddev), bdevname(rdev->bdev, b),
|
||||
mdname(mddev), rdev->bdev,
|
||||
mdname(mddev), conf->geo.raid_disks - mddev->degraded);
|
||||
}
|
||||
|
||||
|
|
@ -2032,13 +2030,12 @@ static void print_conf(struct r10conf *conf)
|
|||
/* This is only called with ->reconfix_mutex held, so
|
||||
* rcu protection of rdev is not needed */
|
||||
for (i = 0; i < conf->geo.raid_disks; i++) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
rdev = conf->mirrors[i].rdev;
|
||||
if (rdev)
|
||||
pr_debug(" disk %d, wo:%d, o:%d, dev:%s\n",
|
||||
pr_debug(" disk %d, wo:%d, o:%d, dev:%pg\n",
|
||||
i, !test_bit(In_sync, &rdev->flags),
|
||||
!test_bit(Faulty, &rdev->flags),
|
||||
bdevname(rdev->bdev,b));
|
||||
rdev->bdev);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2691,14 +2688,11 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
|
|||
check_decay_read_errors(mddev, rdev);
|
||||
atomic_inc(&rdev->read_errors);
|
||||
if (atomic_read(&rdev->read_errors) > max_read_errors) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
bdevname(rdev->bdev, b);
|
||||
|
||||
pr_notice("md/raid10:%s: %s: Raid device exceeded read_error threshold [cur %d:max %d]\n",
|
||||
mdname(mddev), b,
|
||||
pr_notice("md/raid10:%s: %pg: Raid device exceeded read_error threshold [cur %d:max %d]\n",
|
||||
mdname(mddev), rdev->bdev,
|
||||
atomic_read(&rdev->read_errors), max_read_errors);
|
||||
pr_notice("md/raid10:%s: %s: Failing raid device\n",
|
||||
mdname(mddev), b);
|
||||
pr_notice("md/raid10:%s: %pg: Failing raid device\n",
|
||||
mdname(mddev), rdev->bdev);
|
||||
md_error(mddev, rdev);
|
||||
r10_bio->devs[r10_bio->read_slot].bio = IO_BLOCKED;
|
||||
return;
|
||||
|
|
@ -2768,8 +2762,6 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
|
|||
/* write it back and re-read */
|
||||
rcu_read_lock();
|
||||
while (sl != r10_bio->read_slot) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
if (sl==0)
|
||||
sl = conf->copies;
|
||||
sl--;
|
||||
|
|
@ -2788,24 +2780,22 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
|
|||
s, conf->tmppage, WRITE)
|
||||
== 0) {
|
||||
/* Well, this device is dead */
|
||||
pr_notice("md/raid10:%s: read correction write failed (%d sectors at %llu on %s)\n",
|
||||
pr_notice("md/raid10:%s: read correction write failed (%d sectors at %llu on %pg)\n",
|
||||
mdname(mddev), s,
|
||||
(unsigned long long)(
|
||||
sect +
|
||||
choose_data_offset(r10_bio,
|
||||
rdev)),
|
||||
bdevname(rdev->bdev, b));
|
||||
pr_notice("md/raid10:%s: %s: failing drive\n",
|
||||
rdev->bdev);
|
||||
pr_notice("md/raid10:%s: %pg: failing drive\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
}
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
rcu_read_lock();
|
||||
}
|
||||
sl = start;
|
||||
while (sl != r10_bio->read_slot) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
if (sl==0)
|
||||
sl = conf->copies;
|
||||
sl--;
|
||||
|
|
@ -2825,23 +2815,23 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
|
|||
READ)) {
|
||||
case 0:
|
||||
/* Well, this device is dead */
|
||||
pr_notice("md/raid10:%s: unable to read back corrected sectors (%d sectors at %llu on %s)\n",
|
||||
pr_notice("md/raid10:%s: unable to read back corrected sectors (%d sectors at %llu on %pg)\n",
|
||||
mdname(mddev), s,
|
||||
(unsigned long long)(
|
||||
sect +
|
||||
choose_data_offset(r10_bio, rdev)),
|
||||
bdevname(rdev->bdev, b));
|
||||
pr_notice("md/raid10:%s: %s: failing drive\n",
|
||||
rdev->bdev);
|
||||
pr_notice("md/raid10:%s: %pg: failing drive\n",
|
||||
mdname(mddev),
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
break;
|
||||
case 1:
|
||||
pr_info("md/raid10:%s: read error corrected (%d sectors at %llu on %s)\n",
|
||||
pr_info("md/raid10:%s: read error corrected (%d sectors at %llu on %pg)\n",
|
||||
mdname(mddev), s,
|
||||
(unsigned long long)(
|
||||
sect +
|
||||
choose_data_offset(r10_bio, rdev)),
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
atomic_add(s, &rdev->corrected_errors);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3064,11 +3064,10 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev)
|
|||
{
|
||||
struct request_queue *q = bdev_get_queue(rdev->bdev);
|
||||
struct r5l_log *log;
|
||||
char b[BDEVNAME_SIZE];
|
||||
int ret;
|
||||
|
||||
pr_debug("md/raid:%s: using device %s as journal\n",
|
||||
mdname(conf->mddev), bdevname(rdev->bdev, b));
|
||||
pr_debug("md/raid:%s: using device %pg as journal\n",
|
||||
mdname(conf->mddev), rdev->bdev);
|
||||
|
||||
if (PAGE_SIZE != 4096)
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -798,7 +798,6 @@ static int ppl_recover_entry(struct ppl_log *log, struct ppl_header_entry *e,
|
|||
int data_disks;
|
||||
int i;
|
||||
int ret = 0;
|
||||
char b[BDEVNAME_SIZE];
|
||||
unsigned int pp_size = le32_to_cpu(e->pp_size);
|
||||
unsigned int data_size = le32_to_cpu(e->data_size);
|
||||
|
||||
|
|
@ -894,8 +893,8 @@ static int ppl_recover_entry(struct ppl_log *log, struct ppl_header_entry *e,
|
|||
break;
|
||||
}
|
||||
|
||||
pr_debug("%s:%*s reading data member disk %s sector %llu\n",
|
||||
__func__, indent, "", bdevname(rdev->bdev, b),
|
||||
pr_debug("%s:%*s reading data member disk %pg sector %llu\n",
|
||||
__func__, indent, "", rdev->bdev,
|
||||
(unsigned long long)sector);
|
||||
if (!sync_page_io(rdev, sector, block_size, page2,
|
||||
REQ_OP_READ, 0, false)) {
|
||||
|
|
@ -942,10 +941,10 @@ static int ppl_recover_entry(struct ppl_log *log, struct ppl_header_entry *e,
|
|||
conf->disks[sh.pd_idx].rdev, 1);
|
||||
|
||||
BUG_ON(parity_rdev->bdev->bd_dev != log->rdev->bdev->bd_dev);
|
||||
pr_debug("%s:%*s write parity at sector %llu, disk %s\n",
|
||||
pr_debug("%s:%*s write parity at sector %llu, disk %pg\n",
|
||||
__func__, indent, "",
|
||||
(unsigned long long)parity_sector,
|
||||
bdevname(parity_rdev->bdev, b));
|
||||
parity_rdev->bdev);
|
||||
if (!sync_page_io(parity_rdev, parity_sector, block_size,
|
||||
page1, REQ_OP_WRITE, 0, false)) {
|
||||
pr_debug("%s:%*s parity write error!\n", __func__,
|
||||
|
|
@ -1255,7 +1254,6 @@ void ppl_exit_log(struct r5conf *conf)
|
|||
|
||||
static int ppl_validate_rdev(struct md_rdev *rdev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
int ppl_data_sectors;
|
||||
int ppl_size_new;
|
||||
|
||||
|
|
@ -1272,8 +1270,8 @@ static int ppl_validate_rdev(struct md_rdev *rdev)
|
|||
RAID5_STRIPE_SECTORS((struct r5conf *)rdev->mddev->private));
|
||||
|
||||
if (ppl_data_sectors <= 0) {
|
||||
pr_warn("md/raid:%s: PPL space too small on %s\n",
|
||||
mdname(rdev->mddev), bdevname(rdev->bdev, b));
|
||||
pr_warn("md/raid:%s: PPL space too small on %pg\n",
|
||||
mdname(rdev->mddev), rdev->bdev);
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
|
|
@ -1283,16 +1281,16 @@ static int ppl_validate_rdev(struct md_rdev *rdev)
|
|||
rdev->ppl.sector + ppl_size_new > rdev->data_offset) ||
|
||||
(rdev->ppl.sector >= rdev->data_offset &&
|
||||
rdev->data_offset + rdev->sectors > rdev->ppl.sector)) {
|
||||
pr_warn("md/raid:%s: PPL space overlaps with data on %s\n",
|
||||
mdname(rdev->mddev), bdevname(rdev->bdev, b));
|
||||
pr_warn("md/raid:%s: PPL space overlaps with data on %pg\n",
|
||||
mdname(rdev->mddev), rdev->bdev);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!rdev->mddev->external &&
|
||||
((rdev->ppl.offset > 0 && rdev->ppl.offset < (rdev->sb_size >> 9)) ||
|
||||
(rdev->ppl.offset <= 0 && rdev->ppl.offset + ppl_size_new > 0))) {
|
||||
pr_warn("md/raid:%s: PPL space overlaps with superblock on %s\n",
|
||||
mdname(rdev->mddev), bdevname(rdev->bdev, b));
|
||||
pr_warn("md/raid:%s: PPL space overlaps with superblock on %pg\n",
|
||||
mdname(rdev->mddev), rdev->bdev);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -1463,14 +1461,13 @@ int ppl_modify_log(struct r5conf *conf, struct md_rdev *rdev, bool add)
|
|||
struct ppl_conf *ppl_conf = conf->log_private;
|
||||
struct ppl_log *log;
|
||||
int ret = 0;
|
||||
char b[BDEVNAME_SIZE];
|
||||
|
||||
if (!rdev)
|
||||
return -EINVAL;
|
||||
|
||||
pr_debug("%s: disk: %d operation: %s dev: %s\n",
|
||||
pr_debug("%s: disk: %d operation: %s dev: %pg\n",
|
||||
__func__, rdev->raid_disk, add ? "add" : "remove",
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
|
||||
if (rdev->raid_disk < 0)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -2686,7 +2686,6 @@ static void raid5_end_read_request(struct bio * bi)
|
|||
struct stripe_head *sh = bi->bi_private;
|
||||
struct r5conf *conf = sh->raid_conf;
|
||||
int disks = sh->disks, i;
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct md_rdev *rdev = NULL;
|
||||
sector_t s;
|
||||
|
||||
|
|
@ -2723,10 +2722,10 @@ static void raid5_end_read_request(struct bio * bi)
|
|||
* any error
|
||||
*/
|
||||
pr_info_ratelimited(
|
||||
"md/raid:%s: read error corrected (%lu sectors at %llu on %s)\n",
|
||||
"md/raid:%s: read error corrected (%lu sectors at %llu on %pg)\n",
|
||||
mdname(conf->mddev), RAID5_STRIPE_SECTORS(conf),
|
||||
(unsigned long long)s,
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
atomic_add(RAID5_STRIPE_SECTORS(conf), &rdev->corrected_errors);
|
||||
clear_bit(R5_ReadError, &sh->dev[i].flags);
|
||||
clear_bit(R5_ReWrite, &sh->dev[i].flags);
|
||||
|
|
@ -2743,7 +2742,6 @@ static void raid5_end_read_request(struct bio * bi)
|
|||
if (atomic_read(&rdev->read_errors))
|
||||
atomic_set(&rdev->read_errors, 0);
|
||||
} else {
|
||||
const char *bdn = bdevname(rdev->bdev, b);
|
||||
int retry = 0;
|
||||
int set_bad = 0;
|
||||
|
||||
|
|
@ -2752,25 +2750,25 @@ static void raid5_end_read_request(struct bio * bi)
|
|||
atomic_inc(&rdev->read_errors);
|
||||
if (test_bit(R5_ReadRepl, &sh->dev[i].flags))
|
||||
pr_warn_ratelimited(
|
||||
"md/raid:%s: read error on replacement device (sector %llu on %s).\n",
|
||||
"md/raid:%s: read error on replacement device (sector %llu on %pg).\n",
|
||||
mdname(conf->mddev),
|
||||
(unsigned long long)s,
|
||||
bdn);
|
||||
rdev->bdev);
|
||||
else if (conf->mddev->degraded >= conf->max_degraded) {
|
||||
set_bad = 1;
|
||||
pr_warn_ratelimited(
|
||||
"md/raid:%s: read error not correctable (sector %llu on %s).\n",
|
||||
"md/raid:%s: read error not correctable (sector %llu on %pg).\n",
|
||||
mdname(conf->mddev),
|
||||
(unsigned long long)s,
|
||||
bdn);
|
||||
rdev->bdev);
|
||||
} else if (test_bit(R5_ReWrite, &sh->dev[i].flags)) {
|
||||
/* Oh, no!!! */
|
||||
set_bad = 1;
|
||||
pr_warn_ratelimited(
|
||||
"md/raid:%s: read error NOT corrected!! (sector %llu on %s).\n",
|
||||
"md/raid:%s: read error NOT corrected!! (sector %llu on %pg).\n",
|
||||
mdname(conf->mddev),
|
||||
(unsigned long long)s,
|
||||
bdn);
|
||||
rdev->bdev);
|
||||
} else if (atomic_read(&rdev->read_errors)
|
||||
> conf->max_nr_stripes) {
|
||||
if (!test_bit(Faulty, &rdev->flags)) {
|
||||
|
|
@ -2778,8 +2776,8 @@ static void raid5_end_read_request(struct bio * bi)
|
|||
mdname(conf->mddev),
|
||||
atomic_read(&rdev->read_errors),
|
||||
conf->max_nr_stripes);
|
||||
pr_warn("md/raid:%s: Too many read errors, failing device %s.\n",
|
||||
mdname(conf->mddev), bdn);
|
||||
pr_warn("md/raid:%s: Too many read errors, failing device %pg.\n",
|
||||
mdname(conf->mddev), rdev->bdev);
|
||||
}
|
||||
} else
|
||||
retry = 1;
|
||||
|
|
@ -2891,13 +2889,12 @@ static void raid5_end_write_request(struct bio *bi)
|
|||
|
||||
static void raid5_error(struct mddev *mddev, struct md_rdev *rdev)
|
||||
{
|
||||
char b[BDEVNAME_SIZE];
|
||||
struct r5conf *conf = mddev->private;
|
||||
unsigned long flags;
|
||||
pr_debug("raid456: error called\n");
|
||||
|
||||
pr_crit("md/raid:%s: Disk failure on %s, disabling device.\n",
|
||||
mdname(mddev), bdevname(rdev->bdev, b));
|
||||
pr_crit("md/raid:%s: Disk failure on %pg, disabling device.\n",
|
||||
mdname(mddev), rdev->bdev);
|
||||
|
||||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
set_bit(Faulty, &rdev->flags);
|
||||
|
|
@ -7359,9 +7356,8 @@ static struct r5conf *setup_conf(struct mddev *mddev)
|
|||
}
|
||||
|
||||
if (test_bit(In_sync, &rdev->flags)) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
pr_info("md/raid:%s: device %s operational as raid disk %d\n",
|
||||
mdname(mddev), bdevname(rdev->bdev, b), raid_disk);
|
||||
pr_info("md/raid:%s: device %pg operational as raid disk %d\n",
|
||||
mdname(mddev), rdev->bdev, raid_disk);
|
||||
} else if (rdev->saved_raid_disk != raid_disk)
|
||||
/* Cannot rely on bitmap to complete recovery */
|
||||
conf->fullsync = 1;
|
||||
|
|
@ -7877,12 +7873,11 @@ static void print_raid5_conf (struct r5conf *conf)
|
|||
|
||||
rcu_read_lock();
|
||||
for (i = 0; i < conf->raid_disks; i++) {
|
||||
char b[BDEVNAME_SIZE];
|
||||
rdev = rcu_dereference(conf->disks[i].rdev);
|
||||
if (rdev)
|
||||
pr_debug(" disk %d, o:%d, dev:%s\n",
|
||||
pr_debug(" disk %d, o:%d, dev:%pg\n",
|
||||
i, !test_bit(Faulty, &rdev->flags),
|
||||
bdevname(rdev->bdev, b));
|
||||
rdev->bdev);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -280,7 +280,7 @@ int wfx_hif_stop_scan(struct wfx_vif *wvif)
|
|||
}
|
||||
|
||||
int wfx_hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
||||
struct ieee80211_channel *channel, const u8 *ssid, int ssidlen)
|
||||
struct ieee80211_channel *channel, const u8 *ssid, int ssid_len)
|
||||
{
|
||||
int ret;
|
||||
struct wfx_hif_msg *hif;
|
||||
|
|
@ -288,8 +288,8 @@ int wfx_hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
|||
|
||||
WARN_ON(!conf->beacon_int);
|
||||
WARN_ON(!conf->basic_rates);
|
||||
WARN_ON(sizeof(body->ssid) < ssidlen);
|
||||
WARN(!conf->ibss_joined && !ssidlen, "joining an unknown BSS");
|
||||
WARN_ON(sizeof(body->ssid) < ssid_len);
|
||||
WARN(!conf->ibss_joined && !ssid_len, "joining an unknown BSS");
|
||||
if (!hif)
|
||||
return -ENOMEM;
|
||||
body->infrastructure_bss_mode = !conf->ibss_joined;
|
||||
|
|
@ -300,8 +300,8 @@ int wfx_hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf,
|
|||
body->basic_rate_set = cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates));
|
||||
memcpy(body->bssid, conf->bssid, sizeof(body->bssid));
|
||||
if (ssid) {
|
||||
body->ssid_length = cpu_to_le32(ssidlen);
|
||||
memcpy(body->ssid, ssid, ssidlen);
|
||||
body->ssid_length = cpu_to_le32(ssid_len);
|
||||
memcpy(body->ssid, ssid, ssid_len);
|
||||
}
|
||||
wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body));
|
||||
ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ bool wfx_api_older_than(struct wfx_dev *wdev, int major, int minor)
|
|||
*
|
||||
* The PDS file is an array of Time-Length-Value structs.
|
||||
*/
|
||||
int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len)
|
||||
int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len)
|
||||
{
|
||||
int ret, chunk_type, chunk_len, chunk_num = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -409,8 +409,8 @@ static void wfx_join(struct wfx_vif *wvif)
|
|||
struct ieee80211_bss_conf *conf = &vif->bss_conf;
|
||||
struct cfg80211_bss *bss = NULL;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
const u8 *ssidie = NULL;
|
||||
int ssidlen = 0;
|
||||
const u8 *ssid_ie = NULL;
|
||||
int ssid_len = 0;
|
||||
int ret;
|
||||
|
||||
wfx_tx_lock_flush(wvif->wdev);
|
||||
|
|
@ -422,21 +422,21 @@ static void wfx_join(struct wfx_vif *wvif)
|
|||
return;
|
||||
}
|
||||
|
||||
rcu_read_lock(); /* protect ssidie */
|
||||
rcu_read_lock(); /* protect ssid_ie */
|
||||
if (bss)
|
||||
ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
|
||||
if (ssidie) {
|
||||
ssidlen = ssidie[1];
|
||||
if (ssidlen > IEEE80211_MAX_SSID_LEN)
|
||||
ssidlen = IEEE80211_MAX_SSID_LEN;
|
||||
memcpy(ssid, &ssidie[2], ssidlen);
|
||||
ssid_ie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
|
||||
if (ssid_ie) {
|
||||
ssid_len = ssid_ie[1];
|
||||
if (ssid_len > IEEE80211_MAX_SSID_LEN)
|
||||
ssid_len = IEEE80211_MAX_SSID_LEN;
|
||||
memcpy(ssid, &ssid_ie[2], ssid_len);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
cfg80211_put_bss(wvif->wdev->hw->wiphy, bss);
|
||||
|
||||
wvif->join_in_progress = true;
|
||||
ret = wfx_hif_join(wvif, conf, wvif->channel, ssid, ssidlen);
|
||||
ret = wfx_hif_join(wvif, conf, wvif->channel, ssid, ssid_len);
|
||||
if (ret) {
|
||||
ieee80211_connection_loss(vif);
|
||||
wfx_reset(wvif);
|
||||
|
|
|
|||
|
|
@ -1206,9 +1206,10 @@ static void nvme_keep_alive_work(struct work_struct *work)
|
|||
nvme_init_request(rq, &ctrl->ka_cmd);
|
||||
|
||||
rq->timeout = ctrl->kato * HZ;
|
||||
rq->end_io = nvme_keep_alive_end_io;
|
||||
rq->end_io_data = ctrl;
|
||||
rq->rq_flags |= RQF_QUIET;
|
||||
blk_execute_rq_nowait(rq, false, nvme_keep_alive_end_io);
|
||||
blk_execute_rq_nowait(rq, false);
|
||||
}
|
||||
|
||||
static void nvme_start_keep_alive(struct nvme_ctrl *ctrl)
|
||||
|
|
@ -2227,8 +2228,16 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
|
|||
ctrl->ctrl_config |= (NVME_CTRL_PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT;
|
||||
ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE;
|
||||
ctrl->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES;
|
||||
ctrl->ctrl_config |= NVME_CC_ENABLE;
|
||||
ret = ctrl->ops->reg_write32(ctrl, NVME_REG_CC, ctrl->ctrl_config);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Flush write to device (required if transport is PCI) */
|
||||
ret = ctrl->ops->reg_read32(ctrl, NVME_REG_CC, &ctrl->ctrl_config);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ctrl->ctrl_config |= NVME_CC_ENABLE;
|
||||
ret = ctrl->ops->reg_write32(ctrl, NVME_REG_CC, ctrl->ctrl_config);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -453,6 +453,7 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
|
|||
blk_flags);
|
||||
if (IS_ERR(req))
|
||||
return PTR_ERR(req);
|
||||
req->end_io = nvme_uring_cmd_end_io;
|
||||
req->end_io_data = ioucmd;
|
||||
|
||||
/* to free bio on completion, as req->bio will be null at that time */
|
||||
|
|
@ -461,7 +462,7 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
|
|||
pdu->meta_buffer = nvme_to_user_ptr(d.metadata);
|
||||
pdu->meta_len = d.metadata_len;
|
||||
|
||||
blk_execute_rq_nowait(req, 0, nvme_uring_cmd_end_io);
|
||||
blk_execute_rq_nowait(req, false);
|
||||
return -EIOCBQUEUED;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1438,9 +1438,10 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
|||
}
|
||||
nvme_init_request(abort_req, &cmd);
|
||||
|
||||
abort_req->end_io = abort_endio;
|
||||
abort_req->end_io_data = NULL;
|
||||
abort_req->rq_flags |= RQF_QUIET;
|
||||
blk_execute_rq_nowait(abort_req, false, abort_endio);
|
||||
blk_execute_rq_nowait(abort_req, false);
|
||||
|
||||
/*
|
||||
* The aborted req will be completed on receiving the abort req.
|
||||
|
|
@ -2485,12 +2486,15 @@ static int nvme_delete_queue(struct nvme_queue *nvmeq, u8 opcode)
|
|||
return PTR_ERR(req);
|
||||
nvme_init_request(req, &cmd);
|
||||
|
||||
if (opcode == nvme_admin_delete_cq)
|
||||
req->end_io = nvme_del_cq_end;
|
||||
else
|
||||
req->end_io = nvme_del_queue_end;
|
||||
req->end_io_data = nvmeq;
|
||||
|
||||
init_completion(&nvmeq->delete_done);
|
||||
req->rq_flags |= RQF_QUIET;
|
||||
blk_execute_rq_nowait(req, false, opcode == nvme_admin_delete_cq ?
|
||||
nvme_del_cq_end : nvme_del_queue_end);
|
||||
blk_execute_rq_nowait(req, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -3453,6 +3457,8 @@ static const struct pci_device_id nvme_id_table[] = {
|
|||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
|
||||
{ PCI_DEVICE(0x2646, 0x2263), /* KINGSTON A2000 NVMe SSD */
|
||||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
|
||||
{ PCI_DEVICE(0x1e4B, 0x1001), /* MAXIO MAP1001 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1e4B, 0x1002), /* MAXIO MAP1002 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1e4B, 0x1202), /* MAXIO MAP1202 */
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ static u16 nvmet_passthru_override_id_ctrl(struct nvmet_req *req)
|
|||
id->sgls |= cpu_to_le32(1 << 20);
|
||||
|
||||
/*
|
||||
* When passsthru controller is setup using nvme-loop transport it will
|
||||
* When passthru controller is setup using nvme-loop transport it will
|
||||
* export the passthru ctrl subsysnqn (PCIe NVMe ctrl) and will fail in
|
||||
* the nvme/host/core.c in the nvme_init_subsystem()->nvme_active_ctrl()
|
||||
* code path with duplicate ctr subsynqn. In order to prevent that we
|
||||
|
|
@ -285,8 +285,9 @@ static void nvmet_passthru_execute_cmd(struct nvmet_req *req)
|
|||
req->p.rq = rq;
|
||||
queue_work(nvmet_wq, &req->p.work);
|
||||
} else {
|
||||
rq->end_io = nvmet_passthru_req_done;
|
||||
rq->end_io_data = req;
|
||||
blk_execute_rq_nowait(rq, false, nvmet_passthru_req_done);
|
||||
blk_execute_rq_nowait(rq, false);
|
||||
}
|
||||
|
||||
if (ns)
|
||||
|
|
|
|||
|
|
@ -2039,12 +2039,13 @@ static void scsi_eh_lock_door(struct scsi_device *sdev)
|
|||
scmd->cmnd[4] = SCSI_REMOVAL_PREVENT;
|
||||
scmd->cmnd[5] = 0;
|
||||
scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
|
||||
scmd->allowed = 5;
|
||||
|
||||
req->rq_flags |= RQF_QUIET;
|
||||
req->timeout = 10 * HZ;
|
||||
scmd->allowed = 5;
|
||||
req->end_io = eh_lock_door_done;
|
||||
|
||||
blk_execute_rq_nowait(req, true, eh_lock_door_done);
|
||||
blk_execute_rq_nowait(req, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -831,7 +831,8 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
|
|||
|
||||
srp->rq->timeout = timeout;
|
||||
kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */
|
||||
blk_execute_rq_nowait(srp->rq, at_head, sg_rq_end_io);
|
||||
srp->rq->end_io = sg_rq_end_io;
|
||||
blk_execute_rq_nowait(srp->rq, at_head);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -579,9 +579,10 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd,
|
|||
memcpy(scmd->cmnd, cmd, scmd->cmd_len);
|
||||
req->timeout = timeout;
|
||||
scmd->allowed = retries;
|
||||
req->end_io = st_scsi_execute_end;
|
||||
req->end_io_data = SRpnt;
|
||||
|
||||
blk_execute_rq_nowait(req, true, st_scsi_execute_end);
|
||||
blk_execute_rq_nowait(req, true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -671,11 +671,12 @@ static void ufshpb_execute_umap_req(struct ufshpb_lu *hpb,
|
|||
|
||||
req->timeout = 0;
|
||||
req->end_io_data = umap_req;
|
||||
req->end_io = ufshpb_umap_req_compl_fn;
|
||||
|
||||
ufshpb_set_unmap_cmd(scmd->cmnd, rgn);
|
||||
scmd->cmd_len = HPB_WRITE_BUFFER_CMD_LENGTH;
|
||||
|
||||
blk_execute_rq_nowait(req, true, ufshpb_umap_req_compl_fn);
|
||||
blk_execute_rq_nowait(req, true);
|
||||
|
||||
hpb->stats.umap_req_cnt++;
|
||||
}
|
||||
|
|
@ -707,6 +708,7 @@ static int ufshpb_execute_map_req(struct ufshpb_lu *hpb,
|
|||
blk_rq_append_bio(req, map_req->bio);
|
||||
|
||||
req->end_io_data = map_req;
|
||||
req->end_io = ufshpb_map_req_compl_fn;
|
||||
|
||||
if (unlikely(last))
|
||||
mem_size = hpb->last_srgn_entries * HPB_ENTRY_SIZE;
|
||||
|
|
@ -716,7 +718,7 @@ static int ufshpb_execute_map_req(struct ufshpb_lu *hpb,
|
|||
map_req->rb.srgn_idx, mem_size);
|
||||
scmd->cmd_len = HPB_READ_BUFFER_CMD_LENGTH;
|
||||
|
||||
blk_execute_rq_nowait(req, true, ufshpb_map_req_compl_fn);
|
||||
blk_execute_rq_nowait(req, true);
|
||||
|
||||
hpb->stats.map_req_cnt++;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -66,8 +66,6 @@ source "drivers/staging/gdm724x/Kconfig"
|
|||
|
||||
source "drivers/staging/fwserial/Kconfig"
|
||||
|
||||
source "drivers/staging/unisys/Kconfig"
|
||||
|
||||
source "drivers/staging/clocking-wizard/Kconfig"
|
||||
|
||||
source "drivers/staging/fbtft/Kconfig"
|
||||
|
|
@ -88,5 +86,6 @@ source "drivers/staging/fieldbus/Kconfig"
|
|||
|
||||
source "drivers/staging/qlge/Kconfig"
|
||||
|
||||
source "drivers/staging/vme_user/Kconfig"
|
||||
|
||||
endif # STAGING
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ obj-$(CONFIG_OCTEON_ETHERNET) += octeon/
|
|||
obj-$(CONFIG_OCTEON_USB) += octeon-usb/
|
||||
obj-$(CONFIG_VT6655) += vt6655/
|
||||
obj-$(CONFIG_VT6656) += vt6656/
|
||||
obj-$(CONFIG_VME_BUS) += vme/
|
||||
obj-$(CONFIG_VME_BUS) += vme_user/
|
||||
obj-$(CONFIG_IIO) += iio/
|
||||
obj-$(CONFIG_FB_SM750) += sm750fb/
|
||||
obj-$(CONFIG_USB_EMXX) += emxx_udc/
|
||||
|
|
@ -23,7 +23,6 @@ obj-$(CONFIG_ANDROID) += android/
|
|||
obj-$(CONFIG_STAGING_BOARD) += board/
|
||||
obj-$(CONFIG_LTE_GDM724X) += gdm724x/
|
||||
obj-$(CONFIG_FIREWIRE_SERIAL) += fwserial/
|
||||
obj-$(CONFIG_UNISYSSPAR) += unisys/
|
||||
obj-$(CONFIG_COMMON_CLK_XLNX_CLKWZRD) += clocking-wizard/
|
||||
obj-$(CONFIG_FB_TFT) += fbtft/
|
||||
obj-$(CONFIG_MOST) += most/
|
||||
|
|
|
|||
|
|
@ -1384,7 +1384,7 @@ anybuss_host_common_probe(struct device *dev,
|
|||
goto err_device;
|
||||
return cd;
|
||||
err_device:
|
||||
device_unregister(&cd->client->dev);
|
||||
put_device(&cd->client->dev);
|
||||
err_kthread:
|
||||
kthread_stop(cd->qthread);
|
||||
err_reset:
|
||||
|
|
|
|||
|
|
@ -445,7 +445,7 @@ static int __maybe_unused arche_apb_ctrl_suspend(struct device *dev)
|
|||
static int __maybe_unused arche_apb_ctrl_resume(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* Atleast for ES2 we have to meet the delay requirement between
|
||||
* At least for ES2 we have to meet the delay requirement between
|
||||
* unipro switch and AP bridge init, depending on whether bridge is in
|
||||
* OFF state or standby state.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -591,7 +591,7 @@ static __maybe_unused int arche_platform_suspend(struct device *dev)
|
|||
static __maybe_unused int arche_platform_resume(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* Atleast for ES2 we have to meet the delay requirement between
|
||||
* At least for ES2 we have to meet the delay requirement between
|
||||
* unipro switch and AP bridge init, depending on whether bridge is in
|
||||
* OFF state or standby state.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -497,7 +497,7 @@ static int gbcodec_prepare(struct snd_pcm_substream *substream,
|
|||
struct snd_soc_dai *dai)
|
||||
{
|
||||
int ret;
|
||||
struct gbaudio_module_info *module;
|
||||
struct gbaudio_module_info *module = NULL, *iter;
|
||||
struct gbaudio_data_connection *data;
|
||||
struct gb_bundle *bundle;
|
||||
struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
|
||||
|
|
@ -511,11 +511,13 @@ static int gbcodec_prepare(struct snd_pcm_substream *substream,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
list_for_each_entry(module, &codec->module_list, list) {
|
||||
list_for_each_entry(iter, &codec->module_list, list) {
|
||||
/* find the dai */
|
||||
data = find_data(module, dai->id);
|
||||
if (data)
|
||||
data = find_data(iter, dai->id);
|
||||
if (data) {
|
||||
module = iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!data) {
|
||||
dev_err(dai->dev, "DATA connection missing\n");
|
||||
|
|
@ -563,7 +565,7 @@ static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
|
|||
{
|
||||
int ret;
|
||||
struct gbaudio_data_connection *data;
|
||||
struct gbaudio_module_info *module;
|
||||
struct gbaudio_module_info *module = NULL, *iter;
|
||||
struct gb_bundle *bundle;
|
||||
struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev);
|
||||
struct gbaudio_stream_params *params;
|
||||
|
|
@ -592,15 +594,17 @@ static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
|
|||
return ret;
|
||||
}
|
||||
|
||||
list_for_each_entry(module, &codec->module_list, list) {
|
||||
list_for_each_entry(iter, &codec->module_list, list) {
|
||||
/* find the dai */
|
||||
data = find_data(module, dai->id);
|
||||
if (data)
|
||||
data = find_data(iter, dai->id);
|
||||
if (data) {
|
||||
module = iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!data) {
|
||||
dev_err(dai->dev, "%s:%s DATA connection missing\n",
|
||||
dai->name, module->name);
|
||||
dev_err(dai->dev, "%s DATA connection missing\n",
|
||||
dai->name);
|
||||
mutex_unlock(&codec->lock);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
@ -1027,12 +1031,6 @@ static int gbcodec_probe(struct snd_soc_component *comp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void gbcodec_remove(struct snd_soc_component *comp)
|
||||
{
|
||||
/* Empty function for now */
|
||||
return;
|
||||
}
|
||||
|
||||
static int gbcodec_write(struct snd_soc_component *comp, unsigned int reg,
|
||||
unsigned int value)
|
||||
{
|
||||
|
|
@ -1047,8 +1045,6 @@ static unsigned int gbcodec_read(struct snd_soc_component *comp,
|
|||
|
||||
static const struct snd_soc_component_driver soc_codec_dev_gbaudio = {
|
||||
.probe = gbcodec_probe,
|
||||
.remove = gbcodec_remove,
|
||||
|
||||
.read = gbcodec_read,
|
||||
.write = gbcodec_write,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -297,7 +297,6 @@ static int gb_pwm_probe(struct gbphy_device *gbphy_dev,
|
|||
|
||||
pwm->dev = &gbphy_dev->dev;
|
||||
pwm->ops = &gb_pwm_ops;
|
||||
pwm->base = -1; /* Allocate base dynamically */
|
||||
pwm->npwm = pwmc->pwm_max + 1;
|
||||
|
||||
ret = pwmchip_add(pwm);
|
||||
|
|
|
|||
|
|
@ -533,7 +533,7 @@ static int log_results(struct loopback_test *t)
|
|||
|
||||
fd = open(file_name, O_WRONLY | O_CREAT | O_APPEND, 0644);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, "unable to open %s for appendation\n", file_name);
|
||||
fprintf(stderr, "unable to open %s for appending\n", file_name);
|
||||
abort();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -499,7 +499,6 @@ static int ad2s1210_read_raw(struct iio_dev *indio_dev,
|
|||
ret = IIO_VAL_INT;
|
||||
break;
|
||||
case IIO_ANGL_VEL:
|
||||
negative = st->rx[0] & 0x80;
|
||||
vel = be16_to_cpup((__be16 *)st->rx);
|
||||
vel >>= 16 - st->resolution;
|
||||
if (vel & 0x8000) {
|
||||
|
|
|
|||
|
|
@ -84,10 +84,6 @@ static void ks_wlan_hw_wakeup_task(struct work_struct *work)
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* power save */
|
||||
if (atomic_read(&priv->sme_task.count) > 0)
|
||||
tasklet_enable(&priv->sme_task);
|
||||
}
|
||||
|
||||
static void ks_wlan_do_power_save(struct ks_wlan_private *priv)
|
||||
|
|
@ -2200,10 +2196,11 @@ static void hostif_sme_execute(struct ks_wlan_private *priv, int event)
|
|||
}
|
||||
}
|
||||
|
||||
static
|
||||
void hostif_sme_task(struct tasklet_struct *t)
|
||||
static void hostif_sme_work(struct work_struct *work)
|
||||
{
|
||||
struct ks_wlan_private *priv = from_tasklet(priv, t, sme_task);
|
||||
struct ks_wlan_private *priv;
|
||||
|
||||
priv = container_of(work, struct ks_wlan_private, sme_work);
|
||||
|
||||
if (priv->dev_state < DEVICE_STATE_BOOT)
|
||||
return;
|
||||
|
|
@ -2214,7 +2211,7 @@ void hostif_sme_task(struct tasklet_struct *t)
|
|||
hostif_sme_execute(priv, priv->sme_i.event_buff[priv->sme_i.qhead]);
|
||||
inc_smeqhead(priv);
|
||||
if (cnt_smeqbody(priv) > 0)
|
||||
tasklet_schedule(&priv->sme_task);
|
||||
schedule_work(&priv->sme_work);
|
||||
}
|
||||
|
||||
/* send to Station Management Entity module */
|
||||
|
|
@ -2229,7 +2226,7 @@ void hostif_sme_enqueue(struct ks_wlan_private *priv, u16 event)
|
|||
netdev_err(priv->net_dev, "sme queue buffer overflow\n");
|
||||
}
|
||||
|
||||
tasklet_schedule(&priv->sme_task);
|
||||
schedule_work(&priv->sme_work);
|
||||
}
|
||||
|
||||
static inline void hostif_aplist_init(struct ks_wlan_private *priv)
|
||||
|
|
@ -2254,7 +2251,7 @@ static inline void hostif_sme_init(struct ks_wlan_private *priv)
|
|||
priv->sme_i.qtail = 0;
|
||||
spin_lock_init(&priv->sme_i.sme_spin);
|
||||
priv->sme_i.sme_flag = 0;
|
||||
tasklet_setup(&priv->sme_task, hostif_sme_task);
|
||||
INIT_WORK(&priv->sme_work, hostif_sme_work);
|
||||
}
|
||||
|
||||
static inline void hostif_wpa_init(struct ks_wlan_private *priv)
|
||||
|
|
@ -2312,5 +2309,5 @@ int hostif_init(struct ks_wlan_private *priv)
|
|||
|
||||
void hostif_exit(struct ks_wlan_private *priv)
|
||||
{
|
||||
tasklet_kill(&priv->sme_task);
|
||||
cancel_work_sync(&priv->sme_work);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -449,7 +449,7 @@ struct ks_wlan_private {
|
|||
struct sme_info sme_i;
|
||||
u8 *rxp;
|
||||
unsigned int rx_size;
|
||||
struct tasklet_struct sme_task;
|
||||
struct work_struct sme_work;
|
||||
struct work_struct wakeup_work;
|
||||
int scan_ind_count;
|
||||
|
||||
|
|
|
|||
|
|
@ -45,9 +45,6 @@ MODULE_PARM_DESC(fcnt, "Num of frames per sub-buffer for sync channels as a powe
|
|||
|
||||
static DEFINE_SPINLOCK(dim_lock);
|
||||
|
||||
static void dim2_tasklet_fn(unsigned long data);
|
||||
static DECLARE_TASKLET_OLD(dim2_tasklet, dim2_tasklet_fn);
|
||||
|
||||
/**
|
||||
* struct hdm_channel - private structure to keep channel specific data
|
||||
* @name: channel name
|
||||
|
|
@ -361,15 +358,9 @@ static irqreturn_t dim2_mlb_isr(int irq, void *_dev)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/**
|
||||
* dim2_tasklet_fn - tasklet function
|
||||
* @data: private data
|
||||
*
|
||||
* Service each initialized channel, if needed
|
||||
*/
|
||||
static void dim2_tasklet_fn(unsigned long data)
|
||||
static irqreturn_t dim2_task_irq(int irq, void *_dev)
|
||||
{
|
||||
struct dim2_hdm *dev = (struct dim2_hdm *)data;
|
||||
struct dim2_hdm *dev = _dev;
|
||||
unsigned long flags;
|
||||
int ch_idx;
|
||||
|
||||
|
|
@ -385,6 +376,8 @@ static void dim2_tasklet_fn(unsigned long data)
|
|||
while (!try_start_dim_transfer(dev->hch + ch_idx))
|
||||
continue;
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -392,8 +385,8 @@ static void dim2_tasklet_fn(unsigned long data)
|
|||
* @irq: irq number
|
||||
* @_dev: private data
|
||||
*
|
||||
* Acknowledge the interrupt and schedule a tasklet to service channels.
|
||||
* Return IRQ_HANDLED.
|
||||
* Acknowledge the interrupt and service each initialized channel,
|
||||
* if needed, in task context.
|
||||
*/
|
||||
static irqreturn_t dim2_ahb_isr(int irq, void *_dev)
|
||||
{
|
||||
|
|
@ -405,9 +398,7 @@ static irqreturn_t dim2_ahb_isr(int irq, void *_dev)
|
|||
dim_service_ahb_int_irq(get_active_channels(dev, buffer));
|
||||
spin_unlock_irqrestore(&dim_lock, flags);
|
||||
|
||||
dim2_tasklet.data = (unsigned long)dev;
|
||||
tasklet_schedule(&dim2_tasklet);
|
||||
return IRQ_HANDLED;
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -654,14 +645,12 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx)
|
|||
if (!hdm_ch->is_initialized)
|
||||
return -EPERM;
|
||||
|
||||
tasklet_disable(&dim2_tasklet);
|
||||
spin_lock_irqsave(&dim_lock, flags);
|
||||
hal_ret = dim_destroy_channel(&hdm_ch->ch);
|
||||
hdm_ch->is_initialized = false;
|
||||
if (ch_idx == dev->atx_idx)
|
||||
dev->atx_idx = -1;
|
||||
spin_unlock_irqrestore(&dim_lock, flags);
|
||||
tasklet_enable(&dim2_tasklet);
|
||||
if (hal_ret != DIM_NO_ERROR) {
|
||||
pr_err("HAL Failed to close channel %s\n", hdm_ch->name);
|
||||
ret = -EFAULT;
|
||||
|
|
@ -821,8 +810,8 @@ static int dim2_probe(struct platform_device *pdev)
|
|||
goto err_shutdown_dim;
|
||||
}
|
||||
|
||||
ret = devm_request_irq(&pdev->dev, irq, dim2_ahb_isr, 0,
|
||||
"dim2_ahb0_int", dev);
|
||||
ret = devm_request_threaded_irq(&pdev->dev, irq, dim2_ahb_isr,
|
||||
dim2_task_irq, 0, "dim2_ahb0_int", dev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to request ahb0_int irq %d\n", irq);
|
||||
goto err_shutdown_dim;
|
||||
|
|
|
|||
|
|
@ -2072,6 +2072,7 @@ struct qlge_adapter *netdev_to_qdev(struct net_device *ndev)
|
|||
|
||||
return ndev_priv->qdev;
|
||||
}
|
||||
|
||||
/*
|
||||
* The main Adapter structure definition.
|
||||
* This structure has all fields relevant to the hardware.
|
||||
|
|
|
|||
|
|
@ -188,7 +188,6 @@ void expire_timeout_chk(struct adapter *padapter)
|
|||
spin_lock_bh(&pstapriv->auth_list_lock);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
spin_unlock_bh(&pstapriv->auth_list_lock);
|
||||
|
||||
|
|
@ -381,7 +380,6 @@ void add_RATid(struct adapter *padapter, struct sta_info *psta, u8 rssi_level)
|
|||
/* set ra_id, init_rate */
|
||||
psta->raid = raid;
|
||||
psta->init_rate = init_rate;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -455,7 +453,6 @@ void update_bmc_sta(struct adapter *padapter)
|
|||
spin_lock_bh(&psta->lock);
|
||||
psta->state = _FW_LINKED;
|
||||
spin_unlock_bh(&psta->lock);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ static unsigned char *__nat25_find_pppoe_tag(struct pppoe_hdr *ph, unsigned shor
|
|||
unsigned char *cur_ptr, *start_ptr;
|
||||
unsigned short tagLen, tagType;
|
||||
|
||||
start_ptr = cur_ptr = (unsigned char *)ph->tag;
|
||||
start_ptr = (unsigned char *)ph->tag;
|
||||
cur_ptr = (unsigned char *)ph->tag;
|
||||
while ((cur_ptr - start_ptr) < ntohs(ph->length)) {
|
||||
/* prevent un-alignment access */
|
||||
tagType = (unsigned short)((cur_ptr[0] << 8) + cur_ptr[1]);
|
||||
|
|
@ -87,19 +88,19 @@ static int skb_pull_and_merge(struct sk_buff *skb, unsigned char *src, int len)
|
|||
int tail_len;
|
||||
unsigned long end, tail;
|
||||
|
||||
if ((src+len) > skb_tail_pointer(skb) || skb->len < len)
|
||||
if ((src + len) > skb_tail_pointer(skb) || skb->len < len)
|
||||
return -1;
|
||||
|
||||
tail = (unsigned long)skb_tail_pointer(skb);
|
||||
end = (unsigned long)src+len;
|
||||
end = (unsigned long)src + len;
|
||||
if (tail < end)
|
||||
return -1;
|
||||
|
||||
tail_len = (int)(tail-end);
|
||||
tail_len = (int)(tail - end);
|
||||
if (tail_len > 0)
|
||||
memmove(src, src+len, tail_len);
|
||||
memmove(src, src + len, tail_len);
|
||||
|
||||
skb_trim(skb, skb->len-len);
|
||||
skb_trim(skb, skb->len - len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -117,7 +118,7 @@ static void __nat25_generate_ipv4_network_addr(unsigned char *networkAddr,
|
|||
memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
|
||||
|
||||
networkAddr[0] = NAT25_IPV4;
|
||||
memcpy(networkAddr+7, (unsigned char *)ipAddr, 4);
|
||||
memcpy(networkAddr + 7, (unsigned char *)ipAddr, 4);
|
||||
}
|
||||
|
||||
static void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr,
|
||||
|
|
@ -126,8 +127,8 @@ static void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr,
|
|||
memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
|
||||
|
||||
networkAddr[0] = NAT25_PPPOE;
|
||||
memcpy(networkAddr+1, (unsigned char *)sid, 2);
|
||||
memcpy(networkAddr+3, (unsigned char *)ac_mac, 6);
|
||||
memcpy(networkAddr + 1, (unsigned char *)sid, 2);
|
||||
memcpy(networkAddr + 3, (unsigned char *)ac_mac, 6);
|
||||
}
|
||||
|
||||
static void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr,
|
||||
|
|
@ -136,17 +137,17 @@ static void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr,
|
|||
memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);
|
||||
|
||||
networkAddr[0] = NAT25_IPV6;
|
||||
memcpy(networkAddr+1, (unsigned char *)ipAddr, 16);
|
||||
memcpy(networkAddr + 1, (unsigned char *)ipAddr, 16);
|
||||
}
|
||||
|
||||
static unsigned char *scan_tlv(unsigned char *data, int len, unsigned char tag, unsigned char len8b)
|
||||
{
|
||||
while (len > 0) {
|
||||
if (*data == tag && *(data+1) == len8b && len >= len8b*8)
|
||||
return data+2;
|
||||
if (*data == tag && *(data + 1) == len8b && len >= len8b * 8)
|
||||
return data + 2;
|
||||
|
||||
len -= (*(data+1))*8;
|
||||
data += (*(data+1))*8;
|
||||
len -= (*(data + 1)) * 8;
|
||||
data += (*(data + 1)) * 8;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -158,7 +159,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
|
|||
|
||||
if (icmphdr->icmp6_type == NDISC_ROUTER_SOLICITATION) {
|
||||
if (len >= 8) {
|
||||
mac = scan_tlv(&data[8], len-8, 1, 1);
|
||||
mac = scan_tlv(&data[8], len - 8, 1, 1);
|
||||
if (mac) {
|
||||
memcpy(mac, replace_mac, 6);
|
||||
return 1;
|
||||
|
|
@ -166,7 +167,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
|
|||
}
|
||||
} else if (icmphdr->icmp6_type == NDISC_ROUTER_ADVERTISEMENT) {
|
||||
if (len >= 16) {
|
||||
mac = scan_tlv(&data[16], len-16, 1, 1);
|
||||
mac = scan_tlv(&data[16], len - 16, 1, 1);
|
||||
if (mac) {
|
||||
memcpy(mac, replace_mac, 6);
|
||||
return 1;
|
||||
|
|
@ -174,7 +175,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
|
|||
}
|
||||
} else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) {
|
||||
if (len >= 24) {
|
||||
mac = scan_tlv(&data[24], len-24, 1, 1);
|
||||
mac = scan_tlv(&data[24], len - 24, 1, 1);
|
||||
if (mac) {
|
||||
memcpy(mac, replace_mac, 6);
|
||||
return 1;
|
||||
|
|
@ -182,7 +183,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
|
|||
}
|
||||
} else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT) {
|
||||
if (len >= 24) {
|
||||
mac = scan_tlv(&data[24], len-24, 2, 1);
|
||||
mac = scan_tlv(&data[24], len - 24, 2, 1);
|
||||
if (mac) {
|
||||
memcpy(mac, replace_mac, 6);
|
||||
return 1;
|
||||
|
|
@ -190,7 +191,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
|
|||
}
|
||||
} else if (icmphdr->icmp6_type == NDISC_REDIRECT) {
|
||||
if (len >= 40) {
|
||||
mac = scan_tlv(&data[40], len-40, 2, 1);
|
||||
mac = scan_tlv(&data[40], len - 40, 2, 1);
|
||||
if (mac) {
|
||||
memcpy(mac, replace_mac, 6);
|
||||
return 1;
|
||||
|
|
@ -313,6 +314,7 @@ void nat25_db_cleanup(struct adapter *priv)
|
|||
|
||||
for (i = 0; i < NAT25_HASH_SIZE; i++) {
|
||||
struct nat25_network_db_entry *f;
|
||||
|
||||
f = priv->nethash[i];
|
||||
while (f) {
|
||||
struct nat25_network_db_entry *g;
|
||||
|
|
@ -339,12 +341,12 @@ void nat25_db_expire(struct adapter *priv)
|
|||
|
||||
for (i = 0; i < NAT25_HASH_SIZE; i++) {
|
||||
struct nat25_network_db_entry *f;
|
||||
f = priv->nethash[i];
|
||||
|
||||
f = priv->nethash[i];
|
||||
while (f) {
|
||||
struct nat25_network_db_entry *g;
|
||||
g = f->next_hash;
|
||||
|
||||
g = f->next_hash;
|
||||
if (__nat25_has_expired(f)) {
|
||||
if (atomic_dec_and_test(&f->use_count)) {
|
||||
if (priv->scdb_entry == f) {
|
||||
|
|
@ -396,7 +398,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
tmp = be32_to_cpu(iph->saddr);
|
||||
__nat25_generate_ipv4_network_addr(networkAddr, &tmp);
|
||||
/* record source IP address and , source mac address into db */
|
||||
__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
|
||||
__nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr);
|
||||
return 0;
|
||||
default:
|
||||
return -1;
|
||||
|
|
@ -421,7 +423,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
arp_ptr += arp->ar_hln;
|
||||
sender = (unsigned int *)arp_ptr;
|
||||
__nat25_generate_ipv4_network_addr(networkAddr, sender);
|
||||
__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
|
||||
__nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr);
|
||||
return 0;
|
||||
default:
|
||||
return -1;
|
||||
|
|
@ -432,7 +434,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
/* Handle PPPoE frame */
|
||||
/*---------------------------------------------------*/
|
||||
struct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN);
|
||||
unsigned short *pMagic;
|
||||
__be16 *pMagic;
|
||||
|
||||
switch (method) {
|
||||
case NAT25_CHECK:
|
||||
|
|
@ -458,22 +460,22 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
sizeof(tag_buf))
|
||||
return -1;
|
||||
|
||||
memcpy(tag->tag_data+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN,
|
||||
memcpy(tag->tag_data + MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN,
|
||||
pOldTag->tag_data, old_tag_len);
|
||||
|
||||
if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN+old_tag_len) < 0)
|
||||
if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN + old_tag_len) < 0)
|
||||
return -1;
|
||||
|
||||
ph->length = htons(ntohs(ph->length)-TAG_HDR_LEN-old_tag_len);
|
||||
ph->length = htons(ntohs(ph->length) - TAG_HDR_LEN - old_tag_len);
|
||||
}
|
||||
|
||||
tag->tag_type = PTT_RELAY_SID;
|
||||
tag->tag_len = htons(MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN+old_tag_len);
|
||||
tag->tag_len = htons(MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN + old_tag_len);
|
||||
|
||||
/* insert the magic_code+client mac in relay tag */
|
||||
pMagic = (unsigned short *)tag->tag_data;
|
||||
pMagic = (__be16 *)tag->tag_data;
|
||||
*pMagic = htons(MAGIC_CODE);
|
||||
memcpy(tag->tag_data+MAGIC_CODE_LEN, skb->data+ETH_ALEN, ETH_ALEN);
|
||||
memcpy(tag->tag_data + MAGIC_CODE_LEN, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
|
||||
/* Add relay tag */
|
||||
if (__nat25_add_pppoe_tag(skb, tag) < 0)
|
||||
|
|
@ -486,7 +488,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
return -2;
|
||||
|
||||
if (priv->pppoe_connection_in_progress == 0)
|
||||
memcpy(priv->pppoe_addr, skb->data+ETH_ALEN, ETH_ALEN);
|
||||
memcpy(priv->pppoe_addr, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
|
||||
priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE;
|
||||
}
|
||||
|
|
@ -496,11 +498,11 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
} else { /* session phase */
|
||||
__nat25_generate_pppoe_network_addr(networkAddr, skb->data, &ph->sid);
|
||||
|
||||
__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
|
||||
__nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr);
|
||||
|
||||
if (!priv->ethBrExtInfo.addPPPoETag &&
|
||||
priv->pppoe_connection_in_progress &&
|
||||
!memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN))
|
||||
!memcmp(skb->data + ETH_ALEN, priv->pppoe_addr, ETH_ALEN))
|
||||
priv->pppoe_connection_in_progress = 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -548,7 +550,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
case NAT25_INSERT:
|
||||
if (memcmp(&iph->saddr, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0", 16)) {
|
||||
__nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->saddr);
|
||||
__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
|
||||
__nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr);
|
||||
|
||||
if (iph->nexthdr == IPPROTO_ICMPV6 &&
|
||||
skb->len > (ETH_HLEN + sizeof(*iph) + 4)) {
|
||||
|
|
@ -557,9 +559,11 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method)
|
|||
struct icmp6hdr *hdr = (struct icmp6hdr *)(skb->data + ETH_HLEN + sizeof(*iph));
|
||||
hdr->icmp6_cksum = 0;
|
||||
hdr->icmp6_cksum = csum_ipv6_magic(&iph->saddr, &iph->daddr,
|
||||
iph->payload_len,
|
||||
be16_to_cpu(iph->payload_len),
|
||||
IPPROTO_ICMPV6,
|
||||
csum_partial((__u8 *)hdr, iph->payload_len, 0));
|
||||
csum_partial((__u8 *)hdr,
|
||||
be16_to_cpu(iph->payload_len),
|
||||
0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,14 +11,54 @@
|
|||
#include "../include/rtw_mlme_ext.h"
|
||||
#include "../include/rtl8188e_dm.h"
|
||||
|
||||
/*
|
||||
Caller and the rtw_cmd_thread can protect cmd_q by spin_lock.
|
||||
No irqsave is necessary.
|
||||
*/
|
||||
/* Caller and the rtw_cmd_thread can protect cmd_q by spin_lock.
|
||||
* No irqsave is necessary.
|
||||
*/
|
||||
|
||||
static int _rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
|
||||
static void c2h_wk_callback(struct work_struct *work);
|
||||
|
||||
void rtw_free_evt_priv(struct evt_priv *pevtpriv)
|
||||
{
|
||||
int res = _SUCCESS;
|
||||
cancel_work_sync(&pevtpriv->c2h_wk);
|
||||
while (pevtpriv->c2h_wk_alive)
|
||||
msleep(10);
|
||||
|
||||
while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) {
|
||||
void *c2h = rtw_cbuf_pop(pevtpriv->c2h_queue);
|
||||
if (c2h && c2h != (void *)pevtpriv)
|
||||
kfree(c2h);
|
||||
}
|
||||
}
|
||||
|
||||
/* Calling Context:
|
||||
*
|
||||
* rtw_enqueue_cmd can only be called between kernel thread,
|
||||
* since only spin_lock is used.
|
||||
*
|
||||
* ISR/Call-Back functions can't call this sub-function.
|
||||
*/
|
||||
|
||||
static int _rtw_enqueue_cmd(struct __queue *queue, struct cmd_obj *obj)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!obj)
|
||||
goto exit;
|
||||
|
||||
spin_lock_irqsave(&queue->lock, flags);
|
||||
|
||||
list_add_tail(&obj->list, &queue->queue);
|
||||
|
||||
spin_unlock_irqrestore(&queue->lock, flags);
|
||||
|
||||
exit:
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
|
||||
{
|
||||
u32 res = _SUCCESS;
|
||||
|
||||
init_completion(&pcmdpriv->enqueue_cmd);
|
||||
/* sema_init(&(pcmdpriv->cmd_done_sema), 0); */
|
||||
|
|
@ -57,11 +97,9 @@ exit:
|
|||
return res;
|
||||
}
|
||||
|
||||
static void c2h_wk_callback(struct work_struct *work);
|
||||
|
||||
static int _rtw_init_evt_priv(struct evt_priv *pevtpriv)
|
||||
u32 rtw_init_evt_priv(struct evt_priv *pevtpriv)
|
||||
{
|
||||
int res = _SUCCESS;
|
||||
u32 res = _SUCCESS;
|
||||
|
||||
/* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */
|
||||
atomic_set(&pevtpriv->event_seq, 0);
|
||||
|
|
@ -69,98 +107,18 @@ static int _rtw_init_evt_priv(struct evt_priv *pevtpriv)
|
|||
INIT_WORK(&pevtpriv->c2h_wk, c2h_wk_callback);
|
||||
pevtpriv->c2h_wk_alive = false;
|
||||
pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN + 1);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void rtw_free_evt_priv(struct evt_priv *pevtpriv)
|
||||
{
|
||||
cancel_work_sync(&pevtpriv->c2h_wk);
|
||||
while (pevtpriv->c2h_wk_alive)
|
||||
msleep(10);
|
||||
|
||||
while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) {
|
||||
void *c2h = rtw_cbuf_pop(pevtpriv->c2h_queue);
|
||||
if (c2h && c2h != (void *)pevtpriv)
|
||||
kfree(c2h);
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtw_free_cmd_priv(struct cmd_priv *pcmdpriv)
|
||||
{
|
||||
if (pcmdpriv) {
|
||||
kfree(pcmdpriv->cmd_allocated_buf);
|
||||
kfree(pcmdpriv->rsp_allocated_buf);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Calling Context:
|
||||
|
||||
rtw_enqueue_cmd can only be called between kernel thread,
|
||||
since only spin_lock is used.
|
||||
|
||||
ISR/Call-Back functions can't call this sub-function.
|
||||
|
||||
*/
|
||||
|
||||
static int _rtw_enqueue_cmd(struct __queue *queue, struct cmd_obj *obj)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!obj)
|
||||
goto exit;
|
||||
|
||||
spin_lock_irqsave(&queue->lock, flags);
|
||||
|
||||
list_add_tail(&obj->list, &queue->queue);
|
||||
|
||||
spin_unlock_irqrestore(&queue->lock, flags);
|
||||
|
||||
exit:
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static struct cmd_obj *_rtw_dequeue_cmd(struct __queue *queue)
|
||||
{
|
||||
struct cmd_obj *obj;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&queue->lock, flags);
|
||||
if (list_empty(&queue->queue)) {
|
||||
obj = NULL;
|
||||
} else {
|
||||
obj = container_of((&queue->queue)->next, struct cmd_obj, list);
|
||||
list_del_init(&obj->list);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&queue->lock, flags);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
|
||||
{
|
||||
u32 res;
|
||||
|
||||
res = _rtw_init_cmd_priv(pcmdpriv);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
u32 rtw_init_evt_priv(struct evt_priv *pevtpriv)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = _rtw_init_evt_priv(pevtpriv);
|
||||
if (!pevtpriv->c2h_queue)
|
||||
res = _FAIL;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void rtw_free_cmd_priv(struct cmd_priv *pcmdpriv)
|
||||
{
|
||||
_rtw_free_cmd_priv(pcmdpriv);
|
||||
if (pcmdpriv) {
|
||||
kfree(pcmdpriv->cmd_allocated_buf);
|
||||
kfree(pcmdpriv->rsp_allocated_buf);
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
|
||||
|
|
@ -187,7 +145,7 @@ u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
|
|||
cmd_obj->padapter = padapter;
|
||||
|
||||
res = rtw_cmd_filter(pcmdpriv, cmd_obj);
|
||||
if (_FAIL == res) {
|
||||
if (res == _FAIL) {
|
||||
rtw_free_cmd_obj(cmd_obj);
|
||||
goto exit;
|
||||
}
|
||||
|
|
@ -204,11 +162,21 @@ exit:
|
|||
|
||||
struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv)
|
||||
{
|
||||
struct cmd_obj *cmd_obj;
|
||||
struct cmd_obj *obj;
|
||||
struct __queue *queue = &pcmdpriv->cmd_queue;
|
||||
unsigned long flags;
|
||||
|
||||
cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue);
|
||||
spin_lock_irqsave(&queue->lock, flags);
|
||||
if (list_empty(&queue->queue)) {
|
||||
obj = NULL;
|
||||
} else {
|
||||
obj = container_of((&queue->queue)->next, struct cmd_obj, list);
|
||||
list_del_init(&obj->list);
|
||||
}
|
||||
|
||||
return cmd_obj;
|
||||
spin_unlock_irqrestore(&queue->lock, flags);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
void rtw_free_cmd_obj(struct cmd_obj *pcmd)
|
||||
|
|
@ -258,12 +226,12 @@ _next:
|
|||
if (!pcmd)
|
||||
continue;
|
||||
|
||||
if (_FAIL == rtw_cmd_filter(pcmdpriv, pcmd)) {
|
||||
if (rtw_cmd_filter(pcmdpriv, pcmd) == _FAIL) {
|
||||
pcmd->res = H2C_DROPPED;
|
||||
goto post_process;
|
||||
}
|
||||
|
||||
pcmd->cmdsz = _RND4((pcmd->cmdsz));/* _RND4 */
|
||||
pcmd->cmdsz = round_up(pcmd->cmdsz, 4);
|
||||
|
||||
memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz);
|
||||
|
||||
|
|
@ -291,7 +259,7 @@ post_process:
|
|||
rtw_free_cmd_obj(pcmd);
|
||||
else
|
||||
/* todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!= NULL) */
|
||||
pcmd_callback(pcmd->padapter, pcmd);/* need conider that free cmd_obj in rtw_cmd_callback */
|
||||
pcmd_callback(pcmd->padapter, pcmd);/* need consider that free cmd_obj in rtw_cmd_callback */
|
||||
} else {
|
||||
rtw_free_cmd_obj(pcmd);
|
||||
}
|
||||
|
|
@ -316,11 +284,10 @@ post_process:
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
rtw_sitesurvey_cmd(~)
|
||||
### NOTE:#### (!!!!)
|
||||
MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock
|
||||
*/
|
||||
/* rtw_sitesurvey_cmd(~)
|
||||
* ### NOTE:#### (!!!!)
|
||||
* MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock
|
||||
*/
|
||||
u8 rtw_sitesurvey_cmd(struct adapter *padapter, struct ndis_802_11_ssid *ssid, int ssid_num,
|
||||
struct rtw_ieee80211_channel *ch, int ch_num)
|
||||
{
|
||||
|
|
@ -330,19 +297,17 @@ u8 rtw_sitesurvey_cmd(struct adapter *padapter, struct ndis_802_11_ssid *ssid,
|
|||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED)) {
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED))
|
||||
rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1);
|
||||
}
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED)) {
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED))
|
||||
p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1);
|
||||
}
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c)
|
||||
return _FAIL;
|
||||
|
||||
psurveyPara = kzalloc(sizeof(struct sitesurvey_parm), GFP_ATOMIC);
|
||||
psurveyPara = kzalloc(sizeof(*psurveyPara), GFP_ATOMIC);
|
||||
if (!psurveyPara) {
|
||||
kfree(ph2c);
|
||||
return _FAIL;
|
||||
|
|
@ -403,13 +368,13 @@ u8 rtw_setdatarate_cmd(struct adapter *padapter, u8 *rateset)
|
|||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pbsetdataratepara = kzalloc(sizeof(struct setdatarate_parm), GFP_ATOMIC);
|
||||
pbsetdataratepara = kzalloc(sizeof(*pbsetdataratepara), GFP_ATOMIC);
|
||||
if (!pbsetdataratepara) {
|
||||
kfree(ph2c);
|
||||
res = _FAIL;
|
||||
|
|
@ -442,7 +407,7 @@ u8 rtw_createbss_cmd(struct adapter *padapter)
|
|||
|
||||
rtw_led_control(padapter, LED_CTL_START_TO_LINK);
|
||||
|
||||
pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
pcmd = kzalloc(sizeof(*pcmd), GFP_ATOMIC);
|
||||
if (!pcmd) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
|
|
@ -479,7 +444,7 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork)
|
|||
|
||||
rtw_led_control(padapter, LED_CTL_START_TO_LINK);
|
||||
|
||||
pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
pcmd = kzalloc(sizeof(*pcmd), GFP_ATOMIC);
|
||||
if (!pcmd) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
|
|
@ -516,15 +481,14 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork)
|
|||
|
||||
psecuritypriv->authenticator_ie[0] = (unsigned char)psecnetwork->IELength;
|
||||
|
||||
if (psecnetwork->IELength - 12 < 255) {
|
||||
if (psecnetwork->IELength - 12 < 255)
|
||||
memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength - 12);
|
||||
} else {
|
||||
else
|
||||
memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], 255);
|
||||
}
|
||||
|
||||
psecnetwork->IELength = 0;
|
||||
/* Added by Albert 2009/02/18 */
|
||||
/* If the the driver wants to use the bssid to create the connection. */
|
||||
/* If the driver wants to use the bssid to create the connection. */
|
||||
/* If not, we have to copy the connecting AP's MAC address to it so that */
|
||||
/* the driver just has the bssid information for PMKIDList searching. */
|
||||
|
||||
|
|
@ -550,9 +514,9 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork)
|
|||
|
||||
phtpriv->ht_option = false;
|
||||
if (pregistrypriv->ht_enable) {
|
||||
/* Added by Albert 2010/06/23 */
|
||||
/* For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. */
|
||||
/* Especially for Realtek 8192u SoftAP. */
|
||||
/* Added by Albert 2010/06/23 */
|
||||
/* For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. */
|
||||
/* Especially for Realtek 8192u SoftAP. */
|
||||
if ((padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_) &&
|
||||
(padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_) &&
|
||||
(padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_)) {
|
||||
|
|
@ -611,7 +575,7 @@ u8 rtw_disassoc_cmd(struct adapter *padapter, u32 deauth_timeout_ms, bool enqueu
|
|||
res = rtw_enqueue_cmd(cmdpriv, cmdobj);
|
||||
} else {
|
||||
/* no need to enqueue, do the cmd hdl directly and free cmd parameter */
|
||||
if (H2C_SUCCESS != disconnect_hdl(padapter, (u8 *)param))
|
||||
if (disconnect_hdl(padapter, (u8 *)param) != H2C_SUCCESS)
|
||||
res = _FAIL;
|
||||
kfree(param);
|
||||
}
|
||||
|
|
@ -629,12 +593,12 @@ u8 rtw_setopmode_cmd(struct adapter *padapter, enum ndis_802_11_network_infra n
|
|||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_KERNEL);
|
||||
if (!ph2c) {
|
||||
res = false;
|
||||
goto exit;
|
||||
}
|
||||
psetop = kzalloc(sizeof(struct setopmode_parm), GFP_KERNEL);
|
||||
psetop = kzalloc(sizeof(*psetop), GFP_KERNEL);
|
||||
|
||||
if (!psetop) {
|
||||
kfree(ph2c);
|
||||
|
|
@ -664,20 +628,20 @@ u8 rtw_setstakey_cmd(struct adapter *padapter, u8 *psta, u8 unicast_key)
|
|||
struct sta_info *sta = (struct sta_info *)psta;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_KERNEL);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
psetstakey_para = kzalloc(sizeof(struct set_stakey_parm), GFP_KERNEL);
|
||||
psetstakey_para = kzalloc(sizeof(*psetstakey_para), GFP_KERNEL);
|
||||
if (!psetstakey_para) {
|
||||
kfree(ph2c);
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
psetstakey_rsp = kzalloc(sizeof(struct set_stakey_rsp), GFP_KERNEL);
|
||||
psetstakey_rsp = kzalloc(sizeof(*psetstakey_rsp), GFP_KERNEL);
|
||||
if (!psetstakey_rsp) {
|
||||
kfree(ph2c);
|
||||
kfree(psetstakey_para);
|
||||
|
|
@ -723,13 +687,13 @@ u8 rtw_clearstakey_cmd(struct adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
|
|||
if (!enqueue) {
|
||||
clear_cam_entry(padapter, entry);
|
||||
} else {
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
psetstakey_para = kzalloc(sizeof(struct set_stakey_parm),
|
||||
psetstakey_para = kzalloc(sizeof(*psetstakey_para),
|
||||
GFP_ATOMIC);
|
||||
if (!psetstakey_para) {
|
||||
kfree(ph2c);
|
||||
|
|
@ -737,7 +701,7 @@ u8 rtw_clearstakey_cmd(struct adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
psetstakey_rsp = kzalloc(sizeof(struct set_stakey_rsp),
|
||||
psetstakey_rsp = kzalloc(sizeof(*psetstakey_rsp),
|
||||
GFP_ATOMIC);
|
||||
if (!psetstakey_rsp) {
|
||||
kfree(ph2c);
|
||||
|
|
@ -770,13 +734,13 @@ u8 rtw_addbareq_cmd(struct adapter *padapter, u8 tid, u8 *addr)
|
|||
struct addBaReq_parm *paddbareq_parm;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
paddbareq_parm = kzalloc(sizeof(struct addBaReq_parm), GFP_ATOMIC);
|
||||
paddbareq_parm = kzalloc(sizeof(*paddbareq_parm), GFP_ATOMIC);
|
||||
if (!paddbareq_parm) {
|
||||
kfree(ph2c);
|
||||
res = _FAIL;
|
||||
|
|
@ -803,13 +767,13 @@ u8 rtw_dynamic_chk_wk_cmd(struct adapter *padapter)
|
|||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC);
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ph2c);
|
||||
res = _FAIL;
|
||||
|
|
@ -844,7 +808,7 @@ u8 rtw_set_chplan_cmd(struct adapter *padapter, u8 chplan)
|
|||
}
|
||||
|
||||
/* prepare cmd parameter */
|
||||
setChannelPlan_param = kzalloc(sizeof(struct SetChannelPlan_param),
|
||||
setChannelPlan_param = kzalloc(sizeof(*setChannelPlan_param),
|
||||
GFP_KERNEL);
|
||||
if (!setChannelPlan_param) {
|
||||
res = _FAIL;
|
||||
|
|
@ -853,7 +817,7 @@ u8 rtw_set_chplan_cmd(struct adapter *padapter, u8 chplan)
|
|||
setChannelPlan_param->channel_plan = chplan;
|
||||
|
||||
/* need enqueue, prepare cmd_obj and enqueue */
|
||||
pcmdobj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
|
||||
pcmdobj = kzalloc(sizeof(*pcmdobj), GFP_KERNEL);
|
||||
if (!pcmdobj) {
|
||||
kfree(setChannelPlan_param);
|
||||
res = _FAIL;
|
||||
|
|
@ -983,12 +947,12 @@ static void lps_ctrl_wk_hdl(struct adapter *padapter, u8 lps_ctrl_type)
|
|||
mstatus = 1;/* connect */
|
||||
/* Reset LPS Setting */
|
||||
padapter->pwrctrlpriv.LpsIdleCount = 0;
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));
|
||||
rtl8188e_set_FwJoinBssReport_cmd(padapter, mstatus);
|
||||
break;
|
||||
case LPS_CTRL_DISCONNECT:
|
||||
mstatus = 0;/* disconnect */
|
||||
LPS_Leave(padapter);
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));
|
||||
rtl8188e_set_FwJoinBssReport_cmd(padapter, mstatus);
|
||||
break;
|
||||
case LPS_CTRL_SPECIAL_PACKET:
|
||||
pwrpriv->DelayLPSLastTimeStamp = jiffies;
|
||||
|
|
@ -1012,16 +976,16 @@ u8 rtw_lps_ctrl_wk_cmd(struct adapter *padapter, u8 lps_ctrl_type, u8 enqueue)
|
|||
u8 res = _SUCCESS;
|
||||
|
||||
/* if (!pwrctrlpriv->bLeisurePs) */
|
||||
/* return res; */
|
||||
/* return res; */
|
||||
|
||||
if (enqueue) {
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm),
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm),
|
||||
GFP_ATOMIC);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ph2c);
|
||||
|
|
@ -1047,7 +1011,10 @@ exit:
|
|||
|
||||
static void rpt_timer_setting_wk_hdl(struct adapter *padapter, u16 min_time)
|
||||
{
|
||||
SetHwReg8188EU(padapter, HW_VAR_RPT_TIMER_SETTING, (u8 *)(&min_time));
|
||||
struct hal_data_8188e *haldata = &padapter->haldata;
|
||||
struct odm_dm_struct *odmpriv = &haldata->odmpriv;
|
||||
|
||||
ODM_RA_Set_TxRPT_Time(odmpriv, min_time);
|
||||
}
|
||||
|
||||
u8 rtw_rpt_timer_cfg_cmd(struct adapter *padapter, u16 min_time)
|
||||
|
|
@ -1058,13 +1025,13 @@ u8 rtw_rpt_timer_cfg_cmd(struct adapter *padapter, u16 min_time)
|
|||
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm),
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm),
|
||||
GFP_ATOMIC);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ph2c);
|
||||
|
|
@ -1084,7 +1051,20 @@ exit:
|
|||
|
||||
static void antenna_select_wk_hdl(struct adapter *padapter, u8 antenna)
|
||||
{
|
||||
SetHwReg8188EU(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna));
|
||||
struct hal_data_8188e *haldata = &padapter->haldata;
|
||||
|
||||
/* switch current antenna to optimum antenna */
|
||||
if (haldata->CurAntenna != antenna) {
|
||||
ODM_UpdateRxIdleAnt_88E(&haldata->odmpriv, antenna == 2 ? MAIN_ANT : AUX_ANT);
|
||||
haldata->CurAntenna = antenna;
|
||||
}
|
||||
}
|
||||
|
||||
static bool rtw_antenna_diversity(struct adapter *adapter)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &adapter->haldata;
|
||||
|
||||
return haldata->AntDivCfg != 0;
|
||||
}
|
||||
|
||||
u8 rtw_antenna_select_cmd(struct adapter *padapter, u8 antenna, u8 enqueue)
|
||||
|
|
@ -1092,21 +1072,19 @@ u8 rtw_antenna_select_cmd(struct adapter *padapter, u8 antenna, u8 enqueue)
|
|||
struct cmd_obj *ph2c;
|
||||
struct drvextra_cmd_parm *pdrvextra_cmd_parm;
|
||||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 support_ant_div;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
GetHalDefVar8188EUsb(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &support_ant_div);
|
||||
if (!support_ant_div)
|
||||
if (!rtw_antenna_diversity(padapter))
|
||||
return res;
|
||||
|
||||
if (enqueue) {
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_KERNEL);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm),
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm),
|
||||
GFP_KERNEL);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ph2c);
|
||||
|
|
@ -1139,13 +1117,13 @@ u8 p2p_protocol_wk_cmd(struct adapter *padapter, int intCmdType)
|
|||
if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
|
||||
return res;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC);
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ph2c);
|
||||
res = _FAIL;
|
||||
|
|
@ -1153,8 +1131,8 @@ u8 p2p_protocol_wk_cmd(struct adapter *padapter, int intCmdType)
|
|||
}
|
||||
|
||||
pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID;
|
||||
pdrvextra_cmd_parm->type_size = intCmdType; /* As the command tppe. */
|
||||
pdrvextra_cmd_parm->pbuf = NULL; /* Must be NULL here */
|
||||
pdrvextra_cmd_parm->type_size = intCmdType; /* As the command type. */
|
||||
pdrvextra_cmd_parm->pbuf = NULL; /* Must be NULL here */
|
||||
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
|
||||
|
||||
|
|
@ -1173,13 +1151,13 @@ u8 rtw_ps_cmd(struct adapter *padapter)
|
|||
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ppscmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ppscmd = kzalloc(sizeof(*ppscmd), GFP_ATOMIC);
|
||||
if (!ppscmd) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC);
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ppscmd);
|
||||
res = _FAIL;
|
||||
|
|
@ -1197,6 +1175,11 @@ exit:
|
|||
return res;
|
||||
}
|
||||
|
||||
static bool rtw_is_hi_queue_empty(struct adapter *adapter)
|
||||
{
|
||||
return (rtw_read32(adapter, REG_HGQ_INFORMATION) & 0x0000ff00) == 0;
|
||||
}
|
||||
|
||||
static void rtw_chk_hi_queue_hdl(struct adapter *padapter)
|
||||
{
|
||||
int cnt = 0;
|
||||
|
|
@ -1208,12 +1191,7 @@ static void rtw_chk_hi_queue_hdl(struct adapter *padapter)
|
|||
return;
|
||||
|
||||
if (psta_bmc->sleepq_len == 0) {
|
||||
u8 val = 0;
|
||||
|
||||
/* while ((rtw_read32(padapter, 0x414)&0x00ffff00)!= 0) */
|
||||
/* while ((rtw_read32(padapter, 0x414)&0x0000ff00)!= 0) */
|
||||
|
||||
GetHwReg8188EU(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val);
|
||||
bool val = rtw_is_hi_queue_empty(padapter);
|
||||
|
||||
while (!val) {
|
||||
msleep(100);
|
||||
|
|
@ -1223,7 +1201,7 @@ static void rtw_chk_hi_queue_hdl(struct adapter *padapter)
|
|||
if (cnt > 10)
|
||||
break;
|
||||
|
||||
GetHwReg8188EU(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val);
|
||||
val = rtw_is_hi_queue_empty(padapter);
|
||||
}
|
||||
|
||||
if (cnt <= 10) {
|
||||
|
|
@ -1244,13 +1222,13 @@ u8 rtw_chk_hi_queue_cmd(struct adapter *padapter)
|
|||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC);
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ph2c);
|
||||
res = _FAIL;
|
||||
|
|
@ -1275,13 +1253,13 @@ u8 rtw_c2h_wk_cmd(struct adapter *padapter, u8 *c2h_evt)
|
|||
struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
|
||||
u8 res = _SUCCESS;
|
||||
|
||||
ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
|
||||
ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC);
|
||||
if (!ph2c) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC);
|
||||
pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC);
|
||||
if (!pdrvextra_cmd_parm) {
|
||||
kfree(ph2c);
|
||||
res = _FAIL;
|
||||
|
|
@ -1380,8 +1358,8 @@ u8 rtw_drvextra_cmd_hdl(struct adapter *padapter, unsigned char *pbuf)
|
|||
p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type_size);
|
||||
break;
|
||||
case P2P_PROTO_WK_CID:
|
||||
/* Commented by Albert 2011/07/01 */
|
||||
/* I used the type_size as the type command */
|
||||
/* Commented by Albert 2011/07/01 */
|
||||
/* I used the type_size as the type command */
|
||||
p2p_protocol_wk_hdl(padapter, pdrvextra_cmd->type_size);
|
||||
break;
|
||||
case CHECK_HIQ_WK_CID:
|
||||
|
|
@ -1404,11 +1382,8 @@ void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd)
|
|||
{
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
if (pcmd->res == H2C_DROPPED) {
|
||||
if (pcmd->res != H2C_SUCCESS) {
|
||||
/* TODO: cancel timer and do timeout handler directly... */
|
||||
/* need to make timeout handlerOS independent */
|
||||
_set_timer(&pmlmepriv->scan_to_timer, 1);
|
||||
} else if (pcmd->res != H2C_SUCCESS) {
|
||||
_set_timer(&pmlmepriv->scan_to_timer, 1);
|
||||
}
|
||||
|
||||
|
|
@ -1416,6 +1391,7 @@ void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd)
|
|||
rtw_free_cmd_obj(pcmd);
|
||||
|
||||
}
|
||||
|
||||
void rtw_disassoc_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd)
|
||||
{
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
|
@ -1426,8 +1402,10 @@ void rtw_disassoc_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd)
|
|||
spin_unlock_bh(&pmlmepriv->lock);
|
||||
|
||||
return;
|
||||
} else /* clear bridge database */
|
||||
nat25_db_cleanup(padapter);
|
||||
}
|
||||
|
||||
/* clear bridge database */
|
||||
nat25_db_cleanup(padapter);
|
||||
|
||||
/* free cmd */
|
||||
rtw_free_cmd_obj(pcmd);
|
||||
|
|
@ -1437,11 +1415,8 @@ void rtw_joinbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd)
|
|||
{
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
if (pcmd->res == H2C_DROPPED) {
|
||||
if (pcmd->res != H2C_SUCCESS) {
|
||||
/* TODO: cancel timer and do timeout handler directly... */
|
||||
/* need to make timeout handlerOS independent */
|
||||
_set_timer(&pmlmepriv->assoc_timer, 1);
|
||||
} else if (pcmd->res != H2C_SUCCESS) {
|
||||
_set_timer(&pmlmepriv->assoc_timer, 1);
|
||||
}
|
||||
|
||||
|
|
@ -1474,7 +1449,7 @@ void rtw_createbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd)
|
|||
rtw_indicate_connect(padapter);
|
||||
} else {
|
||||
|
||||
pwlan = _rtw_alloc_network(pmlmepriv);
|
||||
pwlan = rtw_alloc_network(pmlmepriv);
|
||||
spin_lock_bh(&pmlmepriv->scanned_queue.lock);
|
||||
if (!pwlan) {
|
||||
pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue);
|
||||
|
|
|
|||
|
|
@ -4,51 +4,43 @@
|
|||
#include <linux/firmware.h>
|
||||
#include "../include/rtw_fw.h"
|
||||
|
||||
#define MAX_REG_BOLCK_SIZE 196
|
||||
#define MAX_REG_BLOCK_SIZE 196
|
||||
#define FW_8188E_START_ADDRESS 0x1000
|
||||
#define MAX_PAGE_SIZE 4096
|
||||
|
||||
#define IS_FW_HEADER_EXIST(_fwhdr) \
|
||||
((le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x92C0 || \
|
||||
(le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x88C0 || \
|
||||
(le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x2300 || \
|
||||
(le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x88E0)
|
||||
|
||||
/* This structure must be careful with byte-ordering */
|
||||
((le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x92C0 || \
|
||||
(le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x88C0 || \
|
||||
(le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x2300 || \
|
||||
(le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x88E0)
|
||||
|
||||
struct rt_firmware_hdr {
|
||||
/* 8-byte alinment required */
|
||||
/* LONG WORD 0 ---- */
|
||||
__le16 Signature; /* 92C0: test chip; 92C,
|
||||
* 88C0: test chip; 88C1: MP A-cut;
|
||||
* 92C1: MP A-cut */
|
||||
u8 Category; /* AP/NIC and USB/PCI */
|
||||
u8 Function; /* Reserved for different FW function
|
||||
* indcation, for further use when
|
||||
* driver needs to download different
|
||||
* FW for different conditions */
|
||||
__le16 Version; /* FW Version */
|
||||
u8 Subversion; /* FW Subversion, default 0x00 */
|
||||
u16 Rsvd1;
|
||||
|
||||
/* LONG WORD 1 ---- */
|
||||
u8 Month; /* Release time Month field */
|
||||
u8 Date; /* Release time Date field */
|
||||
u8 Hour; /* Release time Hour field */
|
||||
u8 Minute; /* Release time Minute field */
|
||||
__le16 RamCodeSize; /* The size of RAM code */
|
||||
u8 Foundry;
|
||||
u8 Rsvd2;
|
||||
|
||||
/* LONG WORD 2 ---- */
|
||||
__le32 SvnIdx; /* The SVN entry index */
|
||||
u32 Rsvd3;
|
||||
|
||||
/* LONG WORD 3 ---- */
|
||||
u32 Rsvd4;
|
||||
u32 Rsvd5;
|
||||
__le16 signature; /* 92C0: test chip; 92C,
|
||||
* 88C0: test chip; 88C1: MP A-cut;
|
||||
* 92C1: MP A-cut */
|
||||
u8 category; /* AP/NIC and USB/PCI */
|
||||
u8 function; /* Reserved for different FW function
|
||||
* indcation, for further use when
|
||||
* driver needs to download different
|
||||
* FW for different conditions */
|
||||
__le16 version; /* FW Version */
|
||||
u8 subversion; /* FW Subversion, default 0x00 */
|
||||
u8 rsvd1;
|
||||
u8 month; /* Release time Month field */
|
||||
u8 date; /* Release time Date field */
|
||||
u8 hour; /* Release time Hour field */
|
||||
u8 minute; /* Release time Minute field */
|
||||
__le16 ramcodesize; /* The size of RAM code */
|
||||
u8 foundry;
|
||||
u8 rsvd2;
|
||||
__le32 svnidx; /* The SVN entry index */
|
||||
__le32 rsvd3;
|
||||
__le32 rsvd4;
|
||||
__le32 rsvd5;
|
||||
};
|
||||
|
||||
static_assert(sizeof(struct rt_firmware_hdr) == 32);
|
||||
|
||||
static void fw_download_enable(struct adapter *padapter, bool enable)
|
||||
{
|
||||
u8 tmp;
|
||||
|
|
@ -71,53 +63,55 @@ static void fw_download_enable(struct adapter *padapter, bool enable)
|
|||
}
|
||||
}
|
||||
|
||||
static int block_write(struct adapter *padapter, void *buffer, u32 buffSize)
|
||||
static int block_write(struct adapter *padapter, u8 *buffer, u32 size)
|
||||
{
|
||||
int ret = _SUCCESS;
|
||||
u32 blockSize_p1 = 4; /* (Default) Phase #1 : PCI muse use 4-byte write to download FW */
|
||||
u32 blockSize_p2 = 8; /* Phase #2 : Use 8-byte, if Phase#1 use big size to write FW. */
|
||||
u32 blockSize_p3 = 1; /* Phase #3 : Use 1-byte, the remnant of FW image. */
|
||||
u32 blockCount_p1 = 0, blockCount_p2 = 0, blockCount_p3 = 0;
|
||||
u32 remainSize_p1 = 0, remainSize_p2 = 0;
|
||||
u8 *bufferPtr = (u8 *)buffer;
|
||||
u32 i = 0, offset = 0;
|
||||
u32 blocks, block_size, remain;
|
||||
u32 i, offset, addr;
|
||||
u8 *data;
|
||||
|
||||
blockSize_p1 = MAX_REG_BOLCK_SIZE;
|
||||
block_size = MAX_REG_BLOCK_SIZE;
|
||||
|
||||
/* 3 Phase #1 */
|
||||
blockCount_p1 = buffSize / blockSize_p1;
|
||||
remainSize_p1 = buffSize % blockSize_p1;
|
||||
blocks = size / block_size;
|
||||
remain = size % block_size;
|
||||
|
||||
for (i = 0; i < blockCount_p1; i++) {
|
||||
ret = rtw_writeN(padapter, (FW_8188E_START_ADDRESS + i * blockSize_p1), blockSize_p1, (bufferPtr + i * blockSize_p1));
|
||||
for (i = 0; i < blocks; i++) {
|
||||
addr = FW_8188E_START_ADDRESS + i * block_size;
|
||||
data = buffer + i * block_size;
|
||||
|
||||
ret = rtw_writeN(padapter, addr, block_size, data);
|
||||
if (ret == _FAIL)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* 3 Phase #2 */
|
||||
if (remainSize_p1) {
|
||||
offset = blockCount_p1 * blockSize_p1;
|
||||
if (remain) {
|
||||
offset = blocks * block_size;
|
||||
block_size = 8;
|
||||
|
||||
blockCount_p2 = remainSize_p1 / blockSize_p2;
|
||||
remainSize_p2 = remainSize_p1 % blockSize_p2;
|
||||
blocks = remain / block_size;
|
||||
remain = remain % block_size;
|
||||
|
||||
for (i = 0; i < blockCount_p2; i++) {
|
||||
ret = rtw_writeN(padapter, (FW_8188E_START_ADDRESS + offset + i * blockSize_p2), blockSize_p2, (bufferPtr + offset + i * blockSize_p2));
|
||||
for (i = 0; i < blocks; i++) {
|
||||
addr = FW_8188E_START_ADDRESS + offset + i * block_size;
|
||||
data = buffer + offset + i * block_size;
|
||||
|
||||
ret = rtw_writeN(padapter, addr, block_size, data);
|
||||
if (ret == _FAIL)
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* 3 Phase #3 */
|
||||
if (remainSize_p2) {
|
||||
offset = (blockCount_p1 * blockSize_p1) + (blockCount_p2 * blockSize_p2);
|
||||
if (remain) {
|
||||
offset += blocks * block_size;
|
||||
|
||||
blockCount_p3 = remainSize_p2 / blockSize_p3;
|
||||
/* block size 1 */
|
||||
blocks = remain;
|
||||
|
||||
for (i = 0; i < blockCount_p3; i++) {
|
||||
ret = rtw_write8(padapter, (FW_8188E_START_ADDRESS + offset + i), *(bufferPtr + offset + i));
|
||||
for (i = 0; i < blocks; i++) {
|
||||
addr = FW_8188E_START_ADDRESS + offset + i;
|
||||
data = buffer + offset + i;
|
||||
|
||||
ret = rtw_write8(padapter, addr, *data);
|
||||
if (ret == _FAIL)
|
||||
goto exit;
|
||||
}
|
||||
|
|
@ -127,7 +121,7 @@ exit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int page_write(struct adapter *padapter, u32 page, void *buffer, u32 size)
|
||||
static int page_write(struct adapter *padapter, u32 page, u8 *buffer, u32 size)
|
||||
{
|
||||
u8 value8;
|
||||
u8 u8Page = (u8)(page & 0x07);
|
||||
|
|
@ -138,21 +132,20 @@ static int page_write(struct adapter *padapter, u32 page, void *buffer, u32 size
|
|||
return block_write(padapter, buffer, size);
|
||||
}
|
||||
|
||||
static int write_fw(struct adapter *padapter, void *buffer, u32 size)
|
||||
static int write_fw(struct adapter *padapter, u8 *buffer, u32 size)
|
||||
{
|
||||
/* Since we need dynamic decide method of dwonload fw, so we call this function to get chip version. */
|
||||
/* We can remove _ReadChipVersion from ReadpadapterInfo8192C later. */
|
||||
int ret = _SUCCESS;
|
||||
u32 pageNums, remainSize;
|
||||
u32 page, offset;
|
||||
u8 *bufferPtr = (u8 *)buffer;
|
||||
|
||||
pageNums = size / MAX_PAGE_SIZE;
|
||||
remainSize = size % MAX_PAGE_SIZE;
|
||||
|
||||
for (page = 0; page < pageNums; page++) {
|
||||
offset = page * MAX_PAGE_SIZE;
|
||||
ret = page_write(padapter, page, bufferPtr + offset, MAX_PAGE_SIZE);
|
||||
ret = page_write(padapter, page, buffer + offset, MAX_PAGE_SIZE);
|
||||
|
||||
if (ret == _FAIL)
|
||||
goto exit;
|
||||
|
|
@ -160,7 +153,7 @@ static int write_fw(struct adapter *padapter, void *buffer, u32 size)
|
|||
if (remainSize) {
|
||||
offset = pageNums * MAX_PAGE_SIZE;
|
||||
page = pageNums;
|
||||
ret = page_write(padapter, page, bufferPtr + offset, remainSize);
|
||||
ret = page_write(padapter, page, buffer + offset, remainSize);
|
||||
|
||||
if (ret == _FAIL)
|
||||
goto exit;
|
||||
|
|
@ -247,14 +240,12 @@ int rtl8188e_firmware_download(struct adapter *padapter)
|
|||
{
|
||||
int ret = _SUCCESS;
|
||||
u8 write_fw_retry = 0;
|
||||
u32 fwdl_start_time;
|
||||
unsigned long fwdl_timeout;
|
||||
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
|
||||
struct device *device = dvobj_to_dev(dvobj);
|
||||
struct rt_firmware_hdr *fwhdr = NULL;
|
||||
u16 fw_version, fw_subversion, fw_signature;
|
||||
u8 *fw_data;
|
||||
u32 fw_size;
|
||||
static int log_version;
|
||||
|
||||
if (!dvobj->firmware.data)
|
||||
ret = load_firmware(&dvobj->firmware, device);
|
||||
|
|
@ -265,21 +256,15 @@ int rtl8188e_firmware_download(struct adapter *padapter)
|
|||
fw_data = dvobj->firmware.data;
|
||||
fw_size = dvobj->firmware.size;
|
||||
|
||||
/* To Check Fw header. Added by tynli. 2009.12.04. */
|
||||
fwhdr = (struct rt_firmware_hdr *)dvobj->firmware.data;
|
||||
|
||||
fw_version = le16_to_cpu(fwhdr->Version);
|
||||
fw_subversion = fwhdr->Subversion;
|
||||
fw_signature = le16_to_cpu(fwhdr->Signature);
|
||||
|
||||
if (!log_version++)
|
||||
pr_info("%sFirmware Version %d, SubVersion %d, Signature 0x%x\n",
|
||||
DRIVER_PREFIX, fw_version, fw_subversion, fw_signature);
|
||||
|
||||
if (IS_FW_HEADER_EXIST(fwhdr)) {
|
||||
/* Shift 32 bytes for FW header */
|
||||
fw_data = fw_data + 32;
|
||||
fw_size = fw_size - 32;
|
||||
pr_info_once("R8188EU: Firmware Version %d, SubVersion %d, Signature 0x%x\n",
|
||||
le16_to_cpu(fwhdr->version), fwhdr->subversion,
|
||||
le16_to_cpu(fwhdr->signature));
|
||||
|
||||
fw_data = fw_data + sizeof(struct rt_firmware_hdr);
|
||||
fw_size = fw_size - sizeof(struct rt_firmware_hdr);
|
||||
}
|
||||
|
||||
/* Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, */
|
||||
|
|
@ -290,7 +275,7 @@ int rtl8188e_firmware_download(struct adapter *padapter)
|
|||
}
|
||||
|
||||
fw_download_enable(padapter, true);
|
||||
fwdl_start_time = jiffies;
|
||||
fwdl_timeout = jiffies + msecs_to_jiffies(500);
|
||||
while (1) {
|
||||
/* reset the FWDL chksum */
|
||||
rtw_write8(padapter, REG_MCUFWDL, rtw_read8(padapter, REG_MCUFWDL) | FWDL_CHKSUM_RPT);
|
||||
|
|
@ -298,7 +283,7 @@ int rtl8188e_firmware_download(struct adapter *padapter)
|
|||
ret = write_fw(padapter, fw_data, fw_size);
|
||||
|
||||
if (ret == _SUCCESS ||
|
||||
(rtw_get_passing_time_ms(fwdl_start_time) > 500 && write_fw_retry++ >= 3))
|
||||
(time_after(jiffies, fwdl_timeout) && write_fw_retry++ >= 3))
|
||||
break;
|
||||
}
|
||||
fw_download_enable(padapter, false);
|
||||
|
|
|
|||
|
|
@ -97,16 +97,15 @@ bool rtw_is_cckratesonly_included(u8 *rate)
|
|||
|
||||
int rtw_check_network_type(unsigned char *rate, int ratelen, int channel)
|
||||
{
|
||||
if (channel > 14) {
|
||||
if (channel > 14)
|
||||
return WIRELESS_INVALID;
|
||||
} else { /* could be pure B, pure G, or B/G */
|
||||
if (rtw_is_cckratesonly_included(rate))
|
||||
return WIRELESS_11B;
|
||||
else if (rtw_is_cckrates_included(rate))
|
||||
return WIRELESS_11BG;
|
||||
else
|
||||
return WIRELESS_11G;
|
||||
}
|
||||
/* could be pure B, pure G, or B/G */
|
||||
if (rtw_is_cckratesonly_included(rate))
|
||||
return WIRELESS_11B;
|
||||
else if (rtw_is_cckrates_included(rate))
|
||||
return WIRELESS_11BG;
|
||||
else
|
||||
return WIRELESS_11G;
|
||||
}
|
||||
|
||||
u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source,
|
||||
|
|
@ -160,11 +159,10 @@ u8 *rtw_get_ie(u8 *pbuf, int index, int *len, int limit)
|
|||
if (*p == index) {
|
||||
*len = *(p + 1);
|
||||
return p;
|
||||
} else {
|
||||
tmp = *(p + 1);
|
||||
p += (tmp + 2);
|
||||
i += (tmp + 2);
|
||||
}
|
||||
tmp = *(p + 1);
|
||||
p += (tmp + 2);
|
||||
i += (tmp + 2);
|
||||
if (i >= limit)
|
||||
break;
|
||||
}
|
||||
|
|
@ -295,10 +293,9 @@ unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit)
|
|||
goto check_next_ie;
|
||||
*wpa_ie_len = *(pbuf + 1);
|
||||
return pbuf;
|
||||
} else {
|
||||
*wpa_ie_len = 0;
|
||||
return NULL;
|
||||
}
|
||||
*wpa_ie_len = 0;
|
||||
return NULL;
|
||||
|
||||
check_next_ie:
|
||||
limit_new = limit - (pbuf - pie) - 2 - len;
|
||||
|
|
@ -558,9 +555,8 @@ u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen)
|
|||
cnt += in_ie[cnt + 1] + 2;
|
||||
|
||||
break;
|
||||
} else {
|
||||
cnt += in_ie[cnt + 1] + 2; /* goto next */
|
||||
}
|
||||
cnt += in_ie[cnt + 1] + 2; /* goto next */
|
||||
}
|
||||
return wpsie_ptr;
|
||||
}
|
||||
|
|
@ -604,9 +600,8 @@ u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id, u8 *buf_att
|
|||
if (len_attr)
|
||||
*len_attr = attr_len;
|
||||
break;
|
||||
} else {
|
||||
attr_ptr += attr_len; /* goto next */
|
||||
}
|
||||
attr_ptr += attr_len; /* goto next */
|
||||
}
|
||||
return target_attr_ptr;
|
||||
}
|
||||
|
|
@ -901,9 +896,8 @@ u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen)
|
|||
if (p2p_ielen)
|
||||
*p2p_ielen = in_ie[cnt + 1] + 2;
|
||||
return p2p_ie_ptr;
|
||||
} else {
|
||||
cnt += in_ie[cnt + 1] + 2; /* goto next */
|
||||
}
|
||||
cnt += in_ie[cnt + 1] + 2; /* goto next */
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -948,9 +942,8 @@ u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id, u8 *buf_attr
|
|||
if (len_attr)
|
||||
*len_attr = attr_len;
|
||||
break;
|
||||
} else {
|
||||
attr_ptr += attr_len; /* goto next */
|
||||
}
|
||||
attr_ptr += attr_len; /* goto next */
|
||||
}
|
||||
return target_attr_ptr;
|
||||
}
|
||||
|
|
@ -1058,7 +1051,7 @@ static int rtw_get_cipher_info(struct wlan_network *pnetwork)
|
|||
pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12);
|
||||
|
||||
if (pbuf && (wpa_ielen > 0)) {
|
||||
if (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) {
|
||||
if (rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x) == _SUCCESS) {
|
||||
pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher;
|
||||
pnetwork->BcnInfo.group_cipher = group_cipher;
|
||||
pnetwork->BcnInfo.is_8021x = is8021x;
|
||||
|
|
@ -1068,7 +1061,7 @@ static int rtw_get_cipher_info(struct wlan_network *pnetwork)
|
|||
pbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12);
|
||||
|
||||
if (pbuf && (wpa_ielen > 0)) {
|
||||
if (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) {
|
||||
if (rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x) == _SUCCESS) {
|
||||
pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher;
|
||||
pnetwork->BcnInfo.group_cipher = group_cipher;
|
||||
pnetwork->BcnInfo.is_8021x = is8021x;
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ u8 rtw_do_join(struct adapter *padapter)
|
|||
pmlmepriv->to_roaming > 0) {
|
||||
/* submit site_survey_cmd */
|
||||
ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0);
|
||||
if (_SUCCESS != ret)
|
||||
if (ret != _SUCCESS)
|
||||
pmlmepriv->to_join = false;
|
||||
} else {
|
||||
pmlmepriv->to_join = false;
|
||||
|
|
@ -91,7 +91,7 @@ u8 rtw_do_join(struct adapter *padapter)
|
|||
if (!pmlmepriv->LinkDetectInfo.bBusyTraffic ||
|
||||
pmlmepriv->to_roaming > 0) {
|
||||
ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0);
|
||||
if (_SUCCESS != ret)
|
||||
if (ret != _SUCCESS)
|
||||
pmlmepriv->to_join = false;
|
||||
} else {
|
||||
ret = _FAIL;
|
||||
|
|
|
|||
|
|
@ -57,10 +57,10 @@ int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len
|
|||
|
||||
bool rtw_IOL_applied(struct adapter *adapter)
|
||||
{
|
||||
if (1 == adapter->registrypriv.fw_iol)
|
||||
if (adapter->registrypriv.fw_iol == 1)
|
||||
return true;
|
||||
|
||||
if ((2 == adapter->registrypriv.fw_iol) &&
|
||||
if ((adapter->registrypriv.fw_iol == 2) &&
|
||||
(adapter_to_dvobj(adapter)->pusbdev->speed != USB_SPEED_HIGH))
|
||||
return true;
|
||||
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ static void blink_work(struct work_struct *work)
|
|||
pLed->bLedLinkBlinkInProgress = true;
|
||||
pLed->CurrLedState = LED_BLINK_NORMAL;
|
||||
schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL);
|
||||
} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
|
||||
} else {
|
||||
pLed->bLedNoLinkBlinkInProgress = true;
|
||||
pLed->CurrLedState = LED_BLINK_SLOWLY;
|
||||
schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL);
|
||||
|
|
@ -131,7 +131,7 @@ static void blink_work(struct work_struct *work)
|
|||
pLed->bLedLinkBlinkInProgress = true;
|
||||
pLed->CurrLedState = LED_BLINK_NORMAL;
|
||||
schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL);
|
||||
} else if (!check_fwstate(pmlmepriv, _FW_LINKED)) {
|
||||
} else {
|
||||
pLed->bLedNoLinkBlinkInProgress = true;
|
||||
pLed->CurrLedState = LED_BLINK_SLOWLY;
|
||||
schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL);
|
||||
|
|
@ -278,7 +278,7 @@ void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction)
|
|||
else
|
||||
pLed->BlinkingLedState = RTW_LED_ON;
|
||||
schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LED_CTL_TX:
|
||||
case LED_CTL_RX:
|
||||
|
|
@ -304,7 +304,7 @@ void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction)
|
|||
}
|
||||
break;
|
||||
case LED_CTL_START_WPS: /* wait until xinpin finish */
|
||||
if (!pLed->bLedWPSBlinkInProgress) {
|
||||
if (!pLed->bLedWPSBlinkInProgress) {
|
||||
if (pLed->bLedNoLinkBlinkInProgress) {
|
||||
cancel_delayed_work(&pLed->blink_work);
|
||||
pLed->bLedNoLinkBlinkInProgress = false;
|
||||
|
|
@ -328,7 +328,7 @@ void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction)
|
|||
else
|
||||
pLed->BlinkingLedState = RTW_LED_ON;
|
||||
schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LED_CTL_STOP_WPS:
|
||||
if (pLed->bLedNoLinkBlinkInProgress) {
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@
|
|||
#include "../include/usb_osintf.h"
|
||||
#include "../include/rtl8188e_dm.h"
|
||||
|
||||
extern unsigned char MCS_rate_2R[16];
|
||||
extern unsigned char MCS_rate_1R[16];
|
||||
|
||||
void rtw_set_roaming(struct adapter *adapter, u8 to_roaming)
|
||||
|
|
@ -31,60 +30,6 @@ u8 rtw_to_roaming(struct adapter *adapter)
|
|||
return adapter->mlmepriv.to_roaming;
|
||||
}
|
||||
|
||||
int _rtw_init_mlme_priv(struct adapter *padapter)
|
||||
{
|
||||
int i;
|
||||
u8 *pbuf;
|
||||
struct wlan_network *pnetwork;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
int res = _SUCCESS;
|
||||
|
||||
/* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */
|
||||
|
||||
pmlmepriv->nic_hdl = (u8 *)padapter;
|
||||
|
||||
pmlmepriv->pscanned = NULL;
|
||||
pmlmepriv->fw_state = 0;
|
||||
pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown;
|
||||
pmlmepriv->scan_mode = SCAN_ACTIVE;/* 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) */
|
||||
|
||||
spin_lock_init(&pmlmepriv->lock);
|
||||
rtw_init_queue(&pmlmepriv->free_bss_pool);
|
||||
rtw_init_queue(&pmlmepriv->scanned_queue);
|
||||
|
||||
set_scanned_network_val(pmlmepriv, 0);
|
||||
|
||||
memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid));
|
||||
|
||||
pbuf = vzalloc(MAX_BSS_CNT * (sizeof(struct wlan_network)));
|
||||
|
||||
if (!pbuf) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
pmlmepriv->free_bss_buf = pbuf;
|
||||
|
||||
pnetwork = (struct wlan_network *)pbuf;
|
||||
|
||||
for (i = 0; i < MAX_BSS_CNT; i++) {
|
||||
INIT_LIST_HEAD(&pnetwork->list);
|
||||
|
||||
list_add_tail(&pnetwork->list, &pmlmepriv->free_bss_pool.queue);
|
||||
|
||||
pnetwork++;
|
||||
}
|
||||
|
||||
/* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */
|
||||
|
||||
rtw_clear_scan_deny(padapter);
|
||||
|
||||
rtw_init_mlme_timer(padapter);
|
||||
|
||||
exit:
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen)
|
||||
{
|
||||
kfree(*ppie);
|
||||
|
|
@ -95,7 +40,6 @@ static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen)
|
|||
void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)
|
||||
{
|
||||
kfree(pmlmepriv->assoc_req);
|
||||
kfree(pmlmepriv->assoc_rsp);
|
||||
rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len);
|
||||
rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len);
|
||||
rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len);
|
||||
|
|
@ -108,49 +52,6 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)
|
|||
rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len);
|
||||
}
|
||||
|
||||
void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv)
|
||||
{
|
||||
|
||||
rtw_free_mlme_priv_ie_data(pmlmepriv);
|
||||
|
||||
if (pmlmepriv) {
|
||||
vfree(pmlmepriv->free_bss_buf);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv)/* _queue *free_queue) */
|
||||
{
|
||||
struct wlan_network *pnetwork;
|
||||
struct __queue *free_queue = &pmlmepriv->free_bss_pool;
|
||||
struct list_head *plist = NULL;
|
||||
|
||||
spin_lock_bh(&free_queue->lock);
|
||||
|
||||
if (list_empty(&free_queue->queue)) {
|
||||
pnetwork = NULL;
|
||||
goto exit;
|
||||
}
|
||||
plist = (&free_queue->queue)->next;
|
||||
|
||||
pnetwork = container_of(plist, struct wlan_network, list);
|
||||
|
||||
list_del_init(&pnetwork->list);
|
||||
|
||||
pnetwork->network_type = 0;
|
||||
pnetwork->fixed = false;
|
||||
pnetwork->last_scanned = jiffies;
|
||||
pnetwork->aid = 0;
|
||||
pnetwork->join_res = 0;
|
||||
|
||||
pmlmepriv->num_of_scanned++;
|
||||
|
||||
exit:
|
||||
spin_unlock_bh(&free_queue->lock);
|
||||
|
||||
return pnetwork;
|
||||
}
|
||||
|
||||
void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall)
|
||||
{
|
||||
u32 curr_time, delta_time;
|
||||
|
|
@ -194,7 +95,7 @@ void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *
|
|||
/*
|
||||
return the wlan_network with the matching addr
|
||||
|
||||
Shall be calle under atomic context... to avoid possible racing condition...
|
||||
Shall be called under atomic context... to avoid possible racing condition...
|
||||
*/
|
||||
struct wlan_network *_rtw_find_network(struct __queue *scanned_queue, u8 *addr)
|
||||
{
|
||||
|
|
@ -291,23 +192,92 @@ u8 *rtw_get_beacon_interval_from_ie(u8 *ie)
|
|||
|
||||
int rtw_init_mlme_priv(struct adapter *padapter)/* struct mlme_priv *pmlmepriv) */
|
||||
{
|
||||
int res;
|
||||
int i;
|
||||
u8 *pbuf;
|
||||
struct wlan_network *pnetwork;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
int res = _SUCCESS;
|
||||
|
||||
res = _rtw_init_mlme_priv(padapter);/* (pmlmepriv); */
|
||||
/* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */
|
||||
|
||||
pmlmepriv->nic_hdl = (u8 *)padapter;
|
||||
|
||||
pmlmepriv->pscanned = NULL;
|
||||
pmlmepriv->fw_state = 0;
|
||||
pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown;
|
||||
pmlmepriv->scan_mode = SCAN_ACTIVE;/* 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) */
|
||||
|
||||
spin_lock_init(&pmlmepriv->lock);
|
||||
rtw_init_queue(&pmlmepriv->free_bss_pool);
|
||||
rtw_init_queue(&pmlmepriv->scanned_queue);
|
||||
|
||||
set_scanned_network_val(pmlmepriv, 0);
|
||||
|
||||
memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid));
|
||||
|
||||
pbuf = vzalloc(MAX_BSS_CNT * (sizeof(struct wlan_network)));
|
||||
|
||||
if (!pbuf) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
pmlmepriv->free_bss_buf = pbuf;
|
||||
|
||||
pnetwork = (struct wlan_network *)pbuf;
|
||||
|
||||
for (i = 0; i < MAX_BSS_CNT; i++) {
|
||||
INIT_LIST_HEAD(&pnetwork->list);
|
||||
|
||||
list_add_tail(&pnetwork->list, &pmlmepriv->free_bss_pool.queue);
|
||||
|
||||
pnetwork++;
|
||||
}
|
||||
|
||||
/* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */
|
||||
|
||||
rtw_clear_scan_deny(padapter);
|
||||
|
||||
rtw_init_mlme_timer(padapter);
|
||||
|
||||
exit:
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv)
|
||||
{
|
||||
_rtw_free_mlme_priv(pmlmepriv);
|
||||
rtw_free_mlme_priv_ie_data(pmlmepriv);
|
||||
vfree(pmlmepriv->free_bss_buf);
|
||||
}
|
||||
|
||||
static struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv)
|
||||
struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv)
|
||||
{
|
||||
struct wlan_network *pnetwork;
|
||||
struct __queue *free_queue = &pmlmepriv->free_bss_pool;
|
||||
struct list_head *plist = NULL;
|
||||
|
||||
pnetwork = _rtw_alloc_network(pmlmepriv);
|
||||
spin_lock_bh(&free_queue->lock);
|
||||
|
||||
if (list_empty(&free_queue->queue)) {
|
||||
pnetwork = NULL;
|
||||
goto exit;
|
||||
}
|
||||
plist = (&free_queue->queue)->next;
|
||||
|
||||
pnetwork = container_of(plist, struct wlan_network, list);
|
||||
|
||||
list_del_init(&pnetwork->list);
|
||||
|
||||
pnetwork->network_type = 0;
|
||||
pnetwork->fixed = false;
|
||||
pnetwork->last_scanned = jiffies;
|
||||
pnetwork->aid = 0;
|
||||
pnetwork->join_res = 0;
|
||||
|
||||
pmlmepriv->num_of_scanned++;
|
||||
|
||||
exit:
|
||||
spin_unlock_bh(&free_queue->lock);
|
||||
|
||||
return pnetwork;
|
||||
}
|
||||
|
|
@ -330,7 +300,7 @@ void rtw_free_network_queue(struct adapter *dev, u8 isfreeall)
|
|||
/*
|
||||
return the wlan_network with the matching addr
|
||||
|
||||
Shall be calle under atomic context... to avoid possible racing condition...
|
||||
Shall be called under atomic context... to avoid possible racing condition...
|
||||
*/
|
||||
struct wlan_network *rtw_find_network(struct __queue *scanned_queue, u8 *addr)
|
||||
{
|
||||
|
|
@ -465,6 +435,13 @@ static void update_current_network(struct adapter *adapter, struct wlan_bssid_ex
|
|||
|
||||
}
|
||||
|
||||
u8 rtw_current_antenna(struct adapter *adapter)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &adapter->haldata;
|
||||
|
||||
return haldata->CurAntenna;
|
||||
}
|
||||
|
||||
/*
|
||||
Caller must hold pmlmepriv->lock first.
|
||||
*/
|
||||
|
|
@ -498,7 +475,8 @@ void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *t
|
|||
/* If there are no more slots, expire the oldest */
|
||||
pnetwork = oldest;
|
||||
|
||||
GetHalDefVar8188EUsb(adapter, HAL_DEF_CURRENT_ANTENNA, &target->PhyInfo.Optimum_antenna);
|
||||
target->PhyInfo.Optimum_antenna = rtw_current_antenna(adapter);
|
||||
|
||||
memcpy(&pnetwork->network, target, get_wlan_bssid_ex_sz(target));
|
||||
/* variable initialize */
|
||||
pnetwork->fixed = false;
|
||||
|
|
@ -521,7 +499,7 @@ void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *t
|
|||
|
||||
bssid_ex_sz = get_wlan_bssid_ex_sz(target);
|
||||
target->Length = bssid_ex_sz;
|
||||
GetHalDefVar8188EUsb(adapter, HAL_DEF_CURRENT_ANTENNA, &target->PhyInfo.Optimum_antenna);
|
||||
target->PhyInfo.Optimum_antenna = rtw_current_antenna(adapter);
|
||||
memcpy(&pnetwork->network, target, bssid_ex_sz);
|
||||
|
||||
pnetwork->last_scanned = jiffies;
|
||||
|
|
@ -567,8 +545,8 @@ static void rtw_add_network(struct adapter *adapter,
|
|||
|
||||
/* select the desired network based on the capability of the (i)bss. */
|
||||
/* check items: (1) security */
|
||||
/* (2) network_type */
|
||||
/* (3) WMM */
|
||||
/* (2) network_type */
|
||||
/* (3) WMM */
|
||||
/* (4) HT */
|
||||
/* (5) others */
|
||||
static bool rtw_is_desired_network(struct adapter *adapter, struct wlan_network *pnetwork)
|
||||
|
|
@ -715,15 +693,12 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf)
|
|||
set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
|
||||
pmlmepriv->to_join = false;
|
||||
s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv);
|
||||
if (_SUCCESS == s_ret) {
|
||||
_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
|
||||
} else if (s_ret == 2) { /* there is no need to wait for join */
|
||||
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
|
||||
rtw_indicate_connect(adapter);
|
||||
if (s_ret == _SUCCESS) {
|
||||
_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
|
||||
} else {
|
||||
if (rtw_to_roaming(adapter) != 0) {
|
||||
if (--pmlmepriv->to_roaming == 0 ||
|
||||
_SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) {
|
||||
rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0) != _SUCCESS) {
|
||||
rtw_set_roaming(adapter, 0);
|
||||
rtw_free_assoc_resources(adapter, 1);
|
||||
rtw_indicate_disconnect(adapter);
|
||||
|
|
@ -748,14 +723,6 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf)
|
|||
rtw_os_xmit_schedule(adapter);
|
||||
}
|
||||
|
||||
void rtw_dummy_event_callback(struct adapter *adapter, u8 *pbuf)
|
||||
{
|
||||
}
|
||||
|
||||
void rtw_fwdbg_event_callback(struct adapter *adapter, u8 *pbuf)
|
||||
{
|
||||
}
|
||||
|
||||
static void free_scanqueue(struct mlme_priv *pmlmepriv)
|
||||
{
|
||||
struct __queue *free_queue = &pmlmepriv->free_bss_pool;
|
||||
|
|
@ -911,9 +878,8 @@ static struct sta_info *rtw_joinbss_update_stainfo(struct adapter *padapter, str
|
|||
memset((u8 *)&psta->dot11txpn, 0, sizeof(union pn48));
|
||||
memset((u8 *)&psta->dot11rxpn, 0, sizeof(union pn48));
|
||||
}
|
||||
/* Commented by Albert 2012/07/21 */
|
||||
/* When doing the WPS, the wps_ie_len won't equal to 0 */
|
||||
/* And the Wi-Fi driver shouldn't allow the data packet to be tramsmitted. */
|
||||
/* When doing the WPS, the wps_ie_len won't equal to 0 */
|
||||
/* And the Wi-Fi driver shouldn't allow the data packet to be transmitted. */
|
||||
if (padapter->securitypriv.wps_ie_len != 0) {
|
||||
psta->ieee8021x_blocked = true;
|
||||
padapter->securitypriv.wps_ie_len = 0;
|
||||
|
|
@ -1071,8 +1037,10 @@ void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf)
|
|||
rtw_indicate_connect(adapter);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&pmlmepriv->lock);
|
||||
/* s5. Cancel assoc_timer */
|
||||
del_timer_sync(&pmlmepriv->assoc_timer);
|
||||
spin_lock_bh(&pmlmepriv->lock);
|
||||
} else {
|
||||
spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
|
||||
goto ignore_joinbss_callback;
|
||||
|
|
@ -1105,6 +1073,11 @@ void rtw_joinbss_event_callback(struct adapter *adapter, u8 *pbuf)
|
|||
|
||||
}
|
||||
|
||||
void rtw_set_max_rpt_macid(struct adapter *adapter, u8 macid)
|
||||
{
|
||||
rtw_write8(adapter, REG_TX_RPT_CTRL + 1, macid + 1);
|
||||
}
|
||||
|
||||
static u8 search_max_mac_id(struct adapter *padapter)
|
||||
{
|
||||
u8 mac_id;
|
||||
|
|
@ -1141,7 +1114,8 @@ void rtw_sta_media_status_rpt(struct adapter *adapter, struct sta_info *psta,
|
|||
return;
|
||||
|
||||
macid = search_max_mac_id(adapter);
|
||||
SetHwReg8188EU(adapter, HW_VAR_TX_RPT_MAX_MACID, (u8 *)&macid);
|
||||
rtw_set_max_rpt_macid(adapter, macid);
|
||||
|
||||
/* MACID|OPMODE:1 connect */
|
||||
media_status_rpt = (u16)((psta->mac_id << 8) | mstatus);
|
||||
SetHwReg8188EU(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status_rpt);
|
||||
|
|
@ -1299,7 +1273,7 @@ void rtw_stadel_event_callback(struct adapter *adapter, u8 *pbuf)
|
|||
}
|
||||
|
||||
/*
|
||||
* _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss
|
||||
* _rtw_join_timeout_handler - Timeout/failure handler for CMD JoinBss
|
||||
* @adapter: pointer to struct adapter structure
|
||||
*/
|
||||
void _rtw_join_timeout_handler (struct adapter *adapter)
|
||||
|
|
@ -1310,7 +1284,7 @@ void _rtw_join_timeout_handler (struct adapter *adapter)
|
|||
if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
|
||||
return;
|
||||
|
||||
spin_lock_bh(&pmlmepriv->lock);
|
||||
spin_lock_irq(&pmlmepriv->lock);
|
||||
|
||||
if (rtw_to_roaming(adapter) > 0) { /* join timeout caused by roaming */
|
||||
while (1) {
|
||||
|
|
@ -1329,12 +1303,12 @@ void _rtw_join_timeout_handler (struct adapter *adapter)
|
|||
rtw_indicate_disconnect(adapter);
|
||||
free_scanqueue(pmlmepriv);/* */
|
||||
}
|
||||
spin_unlock_bh(&pmlmepriv->lock);
|
||||
spin_unlock_irq(&pmlmepriv->lock);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* rtw_scan_timeout_handler - Timeout/Faliure handler for CMD SiteSurvey
|
||||
* rtw_scan_timeout_handler - Timeout/Failure handler for CMD SiteSurvey
|
||||
* @adapter: pointer to struct adapter structure
|
||||
*/
|
||||
void rtw_scan_timeout_handler (struct adapter *adapter)
|
||||
|
|
@ -1414,6 +1388,7 @@ static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv
|
|||
{
|
||||
int updated = false;
|
||||
struct adapter *adapter = container_of(pmlmepriv, struct adapter, mlmepriv);
|
||||
unsigned long scan_res_expire;
|
||||
|
||||
/* check bssid, if needed */
|
||||
if (pmlmepriv->assoc_by_bssid) {
|
||||
|
|
@ -1431,8 +1406,9 @@ static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv
|
|||
if (!rtw_is_desired_network(adapter, competitor))
|
||||
goto exit;
|
||||
|
||||
scan_res_expire = competitor->last_scanned + msecs_to_jiffies(RTW_SCAN_RESULT_EXPIRE);
|
||||
if (rtw_to_roaming(adapter) > 0) {
|
||||
if (rtw_get_passing_time_ms((u32)competitor->last_scanned) >= RTW_SCAN_RESULT_EXPIRE ||
|
||||
if (time_after(jiffies, scan_res_expire) ||
|
||||
!is_same_ess(&competitor->network, &pmlmepriv->cur_network.network))
|
||||
goto exit;
|
||||
}
|
||||
|
|
@ -1461,7 +1437,6 @@ int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv)
|
|||
struct __queue *queue = &pmlmepriv->scanned_queue;
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
struct wlan_network *candidate = NULL;
|
||||
u8 supp_ant_div = false;
|
||||
|
||||
spin_lock_bh(&pmlmepriv->scanned_queue.lock);
|
||||
phead = get_list_head(queue);
|
||||
|
|
@ -1488,12 +1463,6 @@ int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv)
|
|||
rtw_free_assoc_resources(adapter, 0);
|
||||
}
|
||||
|
||||
GetHalDefVar8188EUsb(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &supp_ant_div);
|
||||
if (supp_ant_div) {
|
||||
u8 cur_ant;
|
||||
GetHalDefVar8188EUsb(adapter, HAL_DEF_CURRENT_ANTENNA, &cur_ant);
|
||||
}
|
||||
|
||||
ret = rtw_joinbss_cmd(adapter, candidate);
|
||||
|
||||
exit:
|
||||
|
|
@ -1509,13 +1478,13 @@ int rtw_set_auth(struct adapter *adapter, struct security_priv *psecuritypriv)
|
|||
struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
|
||||
int res = _SUCCESS;
|
||||
|
||||
pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
|
||||
pcmd = kzalloc(sizeof(*pcmd), GFP_KERNEL);
|
||||
if (!pcmd) {
|
||||
res = _FAIL; /* try again */
|
||||
goto exit;
|
||||
}
|
||||
|
||||
psetauthparm = kzalloc(sizeof(struct setauth_parm), GFP_KERNEL);
|
||||
psetauthparm = kzalloc(sizeof(*psetauthparm), GFP_KERNEL);
|
||||
if (!psetauthparm) {
|
||||
kfree(pcmd);
|
||||
res = _FAIL;
|
||||
|
|
@ -1627,39 +1596,23 @@ int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_
|
|||
return ielength;
|
||||
}
|
||||
|
||||
/* */
|
||||
/* Ported from 8185: IsInPreAuthKeyList(). (Renamed from SecIsInPreAuthKeyList(), 2006-10-13.) */
|
||||
/* Added by Annie, 2006-05-07. */
|
||||
/* */
|
||||
/* Search by BSSID, */
|
||||
/* Return Value: */
|
||||
/* -1 :if there is no pre-auth key in the table */
|
||||
/* >= 0 :if there is pre-auth key, and return the entry id */
|
||||
/* -1 :if there is no pre-auth key in the table */
|
||||
/* >= 0 :if there is pre-auth key, and return the entry id */
|
||||
/* */
|
||||
/* */
|
||||
|
||||
static int SecIsInPMKIDList(struct adapter *Adapter, u8 *bssid)
|
||||
{
|
||||
struct security_priv *psecuritypriv = &Adapter->securitypriv;
|
||||
int i = 0;
|
||||
struct security_priv *p = &Adapter->securitypriv;
|
||||
int i;
|
||||
|
||||
do {
|
||||
if ((psecuritypriv->PMKIDList[i].bUsed) &&
|
||||
(!memcmp(psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN))) {
|
||||
break;
|
||||
} else {
|
||||
i++;
|
||||
/* continue; */
|
||||
}
|
||||
|
||||
} while (i < NUM_PMKID_CACHE);
|
||||
|
||||
if (i == NUM_PMKID_CACHE) {
|
||||
i = -1;/* Could not find. */
|
||||
} else {
|
||||
/* There is one Pre-Authentication Key for the specific BSSID. */
|
||||
}
|
||||
return i;
|
||||
for (i = 0; i < NUM_PMKID_CACHE; i++)
|
||||
if (p->PMKIDList[i].bUsed && !memcmp(p->PMKIDList[i].Bssid, bssid, ETH_ALEN))
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* */
|
||||
|
|
@ -1796,10 +1749,23 @@ void rtw_update_registrypriv_dev_network(struct adapter *adapter)
|
|||
|
||||
}
|
||||
|
||||
static void rtw_set_threshold(struct adapter *adapter)
|
||||
{
|
||||
struct mlme_priv *mlmepriv = &adapter->mlmepriv;
|
||||
struct ht_priv *htpriv = &mlmepriv->htpriv;
|
||||
|
||||
if (htpriv->ht_option && adapter->registrypriv.wifi_spec != 1) {
|
||||
/* validate usb rx aggregation, use init value. */
|
||||
rtw_write8(adapter, REG_RXDMA_AGG_PG_TH, USB_RXAGG_PAGE_COUNT);
|
||||
} else {
|
||||
/* invalidate usb rx aggregation */
|
||||
rtw_write8(adapter, REG_RXDMA_AGG_PG_TH, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* the function is at passive_level */
|
||||
void rtw_joinbss_reset(struct adapter *padapter)
|
||||
{
|
||||
u8 threshold;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct ht_priv *phtpriv = &pmlmepriv->htpriv;
|
||||
|
||||
|
|
@ -1810,18 +1776,7 @@ void rtw_joinbss_reset(struct adapter *padapter)
|
|||
|
||||
phtpriv->ampdu_enable = false;/* reset to disabled */
|
||||
|
||||
/* TH = 1 => means that invalidate usb rx aggregation */
|
||||
/* TH = 0 => means that validate usb rx aggregation, use init value. */
|
||||
if (phtpriv->ht_option) {
|
||||
if (padapter->registrypriv.wifi_spec == 1)
|
||||
threshold = 1;
|
||||
else
|
||||
threshold = 0;
|
||||
SetHwReg8188EU(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
|
||||
} else {
|
||||
threshold = 1;
|
||||
SetHwReg8188EU(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
|
||||
}
|
||||
rtw_set_threshold(padapter);
|
||||
}
|
||||
|
||||
/* the function is >= passive_level */
|
||||
|
|
@ -1984,7 +1939,7 @@ void rtw_issue_addbareq_cmd(struct adapter *padapter, struct xmit_frame *pxmitfr
|
|||
issued = (phtpriv->agg_enable_bitmap >> priority) & 0x1;
|
||||
issued |= (phtpriv->candidate_tid_bitmap >> priority) & 0x1;
|
||||
|
||||
if (0 == issued) {
|
||||
if (issued == 0) {
|
||||
psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority);
|
||||
rtw_addbareq_cmd(padapter, (u8)priority, pattrib->ra);
|
||||
}
|
||||
|
|
@ -2011,19 +1966,19 @@ void _rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network)
|
|||
else
|
||||
pnetwork = &pmlmepriv->cur_network;
|
||||
|
||||
if (0 < rtw_to_roaming(padapter)) {
|
||||
if (rtw_to_roaming(padapter) > 0) {
|
||||
memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid, sizeof(struct ndis_802_11_ssid));
|
||||
|
||||
pmlmepriv->assoc_by_bssid = false;
|
||||
|
||||
while (1) {
|
||||
do_join_r = rtw_do_join(padapter);
|
||||
if (_SUCCESS == do_join_r) {
|
||||
if (do_join_r == _SUCCESS) {
|
||||
break;
|
||||
} else {
|
||||
pmlmepriv->to_roaming--;
|
||||
|
||||
if (0 < pmlmepriv->to_roaming) {
|
||||
if (pmlmepriv->to_roaming > 0) {
|
||||
continue;
|
||||
} else {
|
||||
rtw_indicate_disconnect(padapter);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -111,7 +111,7 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)
|
|||
struct xmit_frame *pmgntframe;
|
||||
struct pkt_attrib *pattrib;
|
||||
unsigned char *pframe;
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
__le16 *fctrl;
|
||||
struct adapter *padapter = pwdinfo->padapter;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
|
@ -132,9 +132,9 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)
|
|||
memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
||||
|
||||
pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
|
||||
memcpy(pwlanhdr->addr1, da, ETH_ALEN);
|
||||
|
|
@ -145,8 +145,8 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)
|
|||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pframe += sizeof(struct ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
|
||||
|
||||
/* Build P2P action frame header */
|
||||
pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen);
|
||||
|
|
@ -166,12 +166,12 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s
|
|||
struct xmit_frame *pmgntframe;
|
||||
struct pkt_attrib *pattrib;
|
||||
unsigned char *pframe;
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
__le16 *fctrl;
|
||||
struct adapter *padapter = pwdinfo->padapter;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
||||
unsigned char category = WLAN_CATEGORY_PUBLIC;
|
||||
u8 action = P2P_PUB_ACTION_ACTION;
|
||||
__be32 p2poui = cpu_to_be32(P2POUI);
|
||||
u8 oui_subtype = P2P_DEVDISC_RESP;
|
||||
|
|
@ -189,9 +189,9 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s
|
|||
memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
||||
|
||||
pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
|
||||
memcpy(pwlanhdr->addr1, da, ETH_ALEN);
|
||||
|
|
@ -202,8 +202,8 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s
|
|||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pframe += sizeof(struct ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
|
||||
|
||||
/* Build P2P public action frame header */
|
||||
pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen);
|
||||
|
|
@ -233,7 +233,7 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s
|
|||
static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr, u8 *frame_body, u16 config_method)
|
||||
{
|
||||
struct adapter *padapter = pwdinfo->padapter;
|
||||
unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
|
||||
unsigned char category = WLAN_CATEGORY_PUBLIC;
|
||||
u8 action = P2P_PUB_ACTION_ACTION;
|
||||
u8 dialogToken = frame_body[7]; /* The Dialog Token of provisioning discovery request frame. */
|
||||
__be32 p2poui = cpu_to_be32(P2POUI);
|
||||
|
|
@ -243,7 +243,7 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr,
|
|||
struct xmit_frame *pmgntframe;
|
||||
struct pkt_attrib *pattrib;
|
||||
unsigned char *pframe;
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
__le16 *fctrl;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
|
|
@ -259,9 +259,9 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr,
|
|||
memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
||||
|
||||
pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
|
||||
memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
|
||||
|
|
@ -272,8 +272,8 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr,
|
|||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pframe += sizeof(struct ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
|
||||
|
||||
pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen);
|
||||
pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen);
|
||||
|
|
@ -311,7 +311,7 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8
|
|||
struct xmit_frame *pmgntframe;
|
||||
struct pkt_attrib *pattrib;
|
||||
unsigned char *pframe;
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
__le16 *fctrl;
|
||||
struct adapter *padapter = pwdinfo->padapter;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
|
@ -334,9 +334,9 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8
|
|||
memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
|
||||
|
||||
pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
|
||||
memcpy(pwlanhdr->addr1, da, ETH_ALEN);
|
||||
|
|
@ -347,8 +347,8 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8
|
|||
pmlmeext->mgnt_seq++;
|
||||
SetFrameSubType(pframe, WIFI_ACTION);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pframe += sizeof(struct ieee80211_hdr_3addr);
|
||||
pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
|
||||
|
||||
/* Build P2P action frame header */
|
||||
pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen);
|
||||
|
|
@ -872,7 +872,7 @@ u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint l
|
|||
}
|
||||
|
||||
psta->dev_name_len = 0;
|
||||
if (WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(__be16 *)pattr_content)) {
|
||||
if (be16_to_cpu(*(__be16 *)pattr_content) == WPS_ATTR_DEVICE_NAME) {
|
||||
dev_name_len = be16_to_cpu(*(__be16 *)(pattr_content + 2));
|
||||
|
||||
psta->dev_name_len = (sizeof(psta->dev_name) < dev_name_len) ? sizeof(psta->dev_name) : dev_name_len;
|
||||
|
|
@ -900,7 +900,7 @@ u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le
|
|||
u8 *p2p_ie;
|
||||
u32 p2p_ielen = 0;
|
||||
|
||||
frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
|
||||
frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr));
|
||||
|
||||
dialogToken = frame_body[7];
|
||||
status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
|
||||
|
|
@ -951,7 +951,7 @@ u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le
|
|||
/* issue Device Discoverability Response */
|
||||
issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken);
|
||||
|
||||
return (status == P2P_STATUS_SUCCESS) ? true : false;
|
||||
return status == P2P_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
|
||||
|
|
@ -967,7 +967,7 @@ u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint l
|
|||
u16 uconfig_method = 0;
|
||||
__be16 be_tmp;
|
||||
|
||||
frame_body = (pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
|
||||
frame_body = (pframe + sizeof(struct ieee80211_hdr_3addr));
|
||||
|
||||
wpsie = rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen);
|
||||
if (wpsie) {
|
||||
|
|
@ -1213,7 +1213,7 @@ u8 process_p2p_group_negotation_resp(struct wifidirect_info *pwdinfo, u8 *pframe
|
|||
if (attr_content == P2P_STATUS_SUCCESS) {
|
||||
/* Do nothing. */
|
||||
} else {
|
||||
if (P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content) {
|
||||
if (attr_content == P2P_STATUS_FAIL_INFO_UNAVAILABLE) {
|
||||
rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY);
|
||||
} else {
|
||||
rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
|
||||
|
|
@ -1401,7 +1401,7 @@ u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le
|
|||
u8 dialogToken = 0;
|
||||
u8 status = P2P_STATUS_SUCCESS;
|
||||
|
||||
frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));
|
||||
frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr));
|
||||
|
||||
dialogToken = frame_body[6];
|
||||
|
||||
|
|
@ -1602,7 +1602,7 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state)
|
|||
case P2P_PS_DISABLE:
|
||||
pwdinfo->p2p_ps_state = p2p_ps_state;
|
||||
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
|
||||
rtl8188e_set_p2p_ps_offload_cmd(padapter, p2p_ps_state);
|
||||
|
||||
pwdinfo->noa_index = 0;
|
||||
pwdinfo->ctwindow = 0;
|
||||
|
|
@ -1612,7 +1612,7 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state)
|
|||
if (padapter->pwrctrlpriv.bFwCurrentInPSMode) {
|
||||
if (pwrpriv->smart_ps == 0) {
|
||||
pwrpriv->smart_ps = 2;
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&padapter->pwrctrlpriv.pwr_mode));
|
||||
rtw_set_firmware_ps_mode(padapter, pwrpriv->pwr_mode);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -1623,10 +1623,10 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state)
|
|||
if (pwdinfo->ctwindow > 0) {
|
||||
if (pwrpriv->smart_ps != 0) {
|
||||
pwrpriv->smart_ps = 0;
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&padapter->pwrctrlpriv.pwr_mode));
|
||||
rtw_set_firmware_ps_mode(padapter, pwrpriv->pwr_mode);
|
||||
}
|
||||
}
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
|
||||
rtl8188e_set_p2p_ps_offload_cmd(padapter, p2p_ps_state);
|
||||
}
|
||||
break;
|
||||
case P2P_PS_SCAN:
|
||||
|
|
@ -1634,7 +1634,7 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state)
|
|||
case P2P_PS_ALLSTASLEEP:
|
||||
if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
|
||||
pwdinfo->p2p_ps_state = p2p_ps_state;
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));
|
||||
rtl8188e_set_p2p_ps_offload_cmd(padapter, p2p_ps_state);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
@ -1891,7 +1891,7 @@ int rtw_p2p_enable(struct adapter *padapter, enum P2P_ROLE role)
|
|||
|
||||
if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT || role == P2P_ROLE_GO) {
|
||||
/* leave IPS/Autosuspend */
|
||||
if (_FAIL == rtw_pwr_wakeup(padapter)) {
|
||||
if (rtw_pwr_wakeup(padapter) == _FAIL) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
|
@ -1905,7 +1905,7 @@ int rtw_p2p_enable(struct adapter *padapter, enum P2P_ROLE role)
|
|||
init_wifidirect_info(padapter, role);
|
||||
|
||||
} else if (role == P2P_ROLE_DISABLE) {
|
||||
if (_FAIL == rtw_pwr_wakeup(padapter)) {
|
||||
if (rtw_pwr_wakeup(padapter) == _FAIL) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ int ips_leave(struct adapter *padapter)
|
|||
pwrpriv->rf_pwrstate = rf_on;
|
||||
}
|
||||
|
||||
if ((_WEP40_ == psecuritypriv->dot11PrivacyAlgrthm) || (_WEP104_ == psecuritypriv->dot11PrivacyAlgrthm)) {
|
||||
if ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_)) {
|
||||
set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
|
||||
for (keyid = 0; keyid < 4; keyid++) {
|
||||
if (pmlmepriv->key_mask & BIT(keyid)) {
|
||||
|
|
@ -133,9 +133,8 @@ void rtw_ps_processor(struct adapter *padapter)
|
|||
if (!rtw_pwr_unassociated_idle(padapter))
|
||||
goto exit;
|
||||
|
||||
if ((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts % 4) == 0)) {
|
||||
if (pwrpriv->rf_pwrstate == rf_on) {
|
||||
pwrpriv->change_rfpwrstate = rf_off;
|
||||
|
||||
ips_enter(padapter);
|
||||
}
|
||||
exit:
|
||||
|
|
@ -177,6 +176,19 @@ static bool PS_RDY_CHECK(struct adapter *padapter)
|
|||
return true;
|
||||
}
|
||||
|
||||
void rtw_set_firmware_ps_mode(struct adapter *adapter, u8 mode)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &adapter->haldata;
|
||||
struct odm_dm_struct *odmpriv = &haldata->odmpriv;
|
||||
|
||||
/* Force leave RF low power mode for 1T1R to prevent
|
||||
* conflicting setting in firmware power saving sequence.
|
||||
*/
|
||||
if (mode != PS_MODE_ACTIVE)
|
||||
ODM_RF_Saving(odmpriv, true);
|
||||
rtl8188e_set_FwPwrMode_cmd(adapter, mode);
|
||||
}
|
||||
|
||||
void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
|
||||
|
|
@ -186,7 +198,7 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a
|
|||
return;
|
||||
|
||||
if (pwrpriv->pwr_mode == ps_mode) {
|
||||
if (PS_MODE_ACTIVE == ps_mode)
|
||||
if (ps_mode == PS_MODE_ACTIVE)
|
||||
return;
|
||||
|
||||
if ((pwrpriv->smart_ps == smart_ps) &&
|
||||
|
|
@ -194,11 +206,10 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a
|
|||
return;
|
||||
}
|
||||
|
||||
/* if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) */
|
||||
if (ps_mode == PS_MODE_ACTIVE) {
|
||||
if (pwdinfo->opp_ps == 0) {
|
||||
pwrpriv->pwr_mode = ps_mode;
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
|
||||
rtw_set_firmware_ps_mode(padapter, ps_mode);
|
||||
pwrpriv->bFwCurrentInPSMode = false;
|
||||
}
|
||||
} else {
|
||||
|
|
@ -207,14 +218,28 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a
|
|||
pwrpriv->pwr_mode = ps_mode;
|
||||
pwrpriv->smart_ps = smart_ps;
|
||||
pwrpriv->bcn_ant_mode = bcn_ant_mode;
|
||||
SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
|
||||
rtw_set_firmware_ps_mode(padapter, ps_mode);
|
||||
|
||||
/* Set CTWindow after LPS */
|
||||
if (pwdinfo->opp_ps == 1)
|
||||
p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool lps_rf_on(struct adapter *adapter)
|
||||
{
|
||||
/* When we halt NIC, we should check if FW LPS is leave. */
|
||||
if (adapter->pwrctrlpriv.rf_pwrstate == rf_off) {
|
||||
/* If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, */
|
||||
/* because Fw is unload. */
|
||||
return true;
|
||||
}
|
||||
|
||||
if (rtw_read32(adapter, REG_RCR) & 0x00070000)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -223,16 +248,13 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a
|
|||
* -1: Timeout
|
||||
* -2: Other error
|
||||
*/
|
||||
s32 LPS_RF_ON_check(struct adapter *padapter, u32 delay_ms)
|
||||
static s32 LPS_RF_ON_check(struct adapter *padapter, u32 delay_ms)
|
||||
{
|
||||
u32 start_time;
|
||||
u8 bAwake = false;
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(delay_ms);
|
||||
s32 err = 0;
|
||||
|
||||
start_time = jiffies;
|
||||
while (1) {
|
||||
GetHwReg8188EU(padapter, HW_VAR_FWLPS_RF_ON, &bAwake);
|
||||
if (bAwake)
|
||||
if (lps_rf_on(padapter))
|
||||
break;
|
||||
|
||||
if (padapter->bSurpriseRemoved) {
|
||||
|
|
@ -240,7 +262,7 @@ s32 LPS_RF_ON_check(struct adapter *padapter, u32 delay_ms)
|
|||
break;
|
||||
}
|
||||
|
||||
if (rtw_get_passing_time_ms(start_time) > delay_ms) {
|
||||
if (time_after(jiffies, timeout)) {
|
||||
err = -1;
|
||||
break;
|
||||
}
|
||||
|
|
@ -329,13 +351,12 @@ void rtw_init_pwrctrl_priv(struct adapter *padapter)
|
|||
pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode;
|
||||
|
||||
pwrctrlpriv->pwr_state_check_interval = RTW_PWR_STATE_CHK_INTERVAL;
|
||||
pwrctrlpriv->pwr_state_check_cnts = 0;
|
||||
pwrctrlpriv->bInSuspend = false;
|
||||
pwrctrlpriv->bkeepfwalive = false;
|
||||
|
||||
pwrctrlpriv->LpsIdleCount = 0;
|
||||
pwrctrlpriv->power_mgnt = padapter->registrypriv.power_mgnt;/* PS_MODE_MIN; */
|
||||
pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? true : false;
|
||||
pwrctrlpriv->bLeisurePs = pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE;
|
||||
|
||||
pwrctrlpriv->bFwCurrentInPSMode = false;
|
||||
|
||||
|
|
@ -346,58 +367,38 @@ void rtw_init_pwrctrl_priv(struct adapter *padapter)
|
|||
timer_setup(&pwrctrlpriv->pwr_state_check_timer, pwr_state_check_handler, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* rtw_pwr_wakeup - Wake the NIC up from: 1)IPS. 2)USB autosuspend
|
||||
* @adapter: pointer to struct adapter structure
|
||||
* @ips_deffer_ms: the ms wiil prevent from falling into IPS after wakeup
|
||||
* Return _SUCCESS or _FAIL
|
||||
*/
|
||||
|
||||
int _rtw_pwr_wakeup(struct adapter *padapter, u32 ips_deffer_ms, const char *caller)
|
||||
/* Wake the NIC up from: 1)IPS 2)USB autosuspend */
|
||||
int rtw_pwr_wakeup(struct adapter *padapter)
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(3000);
|
||||
unsigned long deny_time;
|
||||
int ret = _SUCCESS;
|
||||
u32 start = jiffies;
|
||||
|
||||
if (pwrpriv->ips_deny_time < jiffies + rtw_ms_to_systime(ips_deffer_ms))
|
||||
pwrpriv->ips_deny_time = jiffies + rtw_ms_to_systime(ips_deffer_ms);
|
||||
|
||||
if (pwrpriv->ps_processing) {
|
||||
while (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000)
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
/* System suspend is not allowed to wakeup */
|
||||
if (pwrpriv->bInSuspend) {
|
||||
while (pwrpriv->bInSuspend &&
|
||||
(rtw_get_passing_time_ms(start) <= 3000 ||
|
||||
(rtw_get_passing_time_ms(start) <= 500)))
|
||||
msleep(10);
|
||||
}
|
||||
while (pwrpriv->ps_processing && time_before(jiffies, timeout))
|
||||
msleep(10);
|
||||
|
||||
/* I think this should be check in IPS, LPS, autosuspend functions... */
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED)) {
|
||||
ret = _SUCCESS;
|
||||
goto exit;
|
||||
}
|
||||
if (rf_off == pwrpriv->rf_pwrstate) {
|
||||
if (_FAIL == ips_leave(padapter)) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (pwrpriv->rf_pwrstate == rf_off && ips_leave(padapter) == _FAIL) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* TODO: the following checking need to be merged... */
|
||||
if (padapter->bDriverStopped || !padapter->bup ||
|
||||
!padapter->hw_init_completed) {
|
||||
ret = false;
|
||||
if (padapter->bDriverStopped || !padapter->bup || !padapter->hw_init_completed) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
exit:
|
||||
if (pwrpriv->ips_deny_time < jiffies + rtw_ms_to_systime(ips_deffer_ms))
|
||||
pwrpriv->ips_deny_time = jiffies + rtw_ms_to_systime(ips_deffer_ms);
|
||||
deny_time = jiffies + msecs_to_jiffies(RTW_PWR_STATE_CHK_INTERVAL);
|
||||
if (time_before(pwrpriv->ips_deny_time, deny_time))
|
||||
pwrpriv->ips_deny_time = deny_time;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -408,12 +409,12 @@ int rtw_pm_set_lps(struct adapter *padapter, u8 mode)
|
|||
|
||||
if (mode < PS_MODE_NUM) {
|
||||
if (pwrctrlpriv->power_mgnt != mode) {
|
||||
if (PS_MODE_ACTIVE == mode)
|
||||
if (mode == PS_MODE_ACTIVE)
|
||||
LeaveAllPowerSaveMode(padapter);
|
||||
else
|
||||
pwrctrlpriv->LpsIdleCount = 2;
|
||||
pwrctrlpriv->power_mgnt = mode;
|
||||
pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? true : false;
|
||||
pwrctrlpriv->bLeisurePs = pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE;
|
||||
}
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
|
|
@ -431,7 +432,7 @@ int rtw_pm_set_ips(struct adapter *padapter, u8 mode)
|
|||
return 0;
|
||||
} else if (mode == IPS_NONE) {
|
||||
rtw_ips_mode_req(pwrctrlpriv, mode);
|
||||
if ((padapter->bSurpriseRemoved == 0) && (_FAIL == rtw_pwr_wakeup(padapter)))
|
||||
if ((padapter->bSurpriseRemoved == 0) && (rtw_pwr_wakeup(padapter) == _FAIL))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -71,7 +71,6 @@ int _rtw_init_recv_priv(struct recv_priv *precvpriv, struct adapter *padapter)
|
|||
|
||||
list_add_tail(&precvframe->list, &precvpriv->free_recv_queue.queue);
|
||||
|
||||
precvframe->pkt_newalloc = NULL;
|
||||
precvframe->pkt = NULL;
|
||||
|
||||
precvframe->len = 0;
|
||||
|
|
@ -81,8 +80,6 @@ int _rtw_init_recv_priv(struct recv_priv *precvpriv, struct adapter *padapter)
|
|||
}
|
||||
precvpriv->rx_pending_cnt = 1;
|
||||
|
||||
sema_init(&precvpriv->allrxreturnevt, 0);
|
||||
|
||||
res = rtl8188eu_init_recv_priv(padapter);
|
||||
|
||||
timer_setup(&precvpriv->signal_stat_timer, rtw_signal_stat_timer_hdl, 0);
|
||||
|
|
@ -749,6 +746,7 @@ static int sta2ap_data_frame(struct adapter *adapter,
|
|||
struct sta_priv *pstapriv = &adapter->stapriv;
|
||||
struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
|
||||
u8 *ptr = precv_frame->rx_data;
|
||||
__le16 fc = *(__le16 *)ptr;
|
||||
unsigned char *mybssid = get_bssid(pmlmepriv);
|
||||
int ret = _SUCCESS;
|
||||
|
||||
|
|
@ -769,9 +767,8 @@ static int sta2ap_data_frame(struct adapter *adapter,
|
|||
|
||||
process_pwrbit_data(adapter, precv_frame);
|
||||
|
||||
if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {
|
||||
if (ieee80211_is_data_qos(fc))
|
||||
process_wmmps_data(adapter, precv_frame);
|
||||
}
|
||||
|
||||
if (GetFrameSubType(ptr) & BIT(6)) {
|
||||
/* No data, will not indicate to upper layer, temporily count it here */
|
||||
|
|
@ -795,143 +792,135 @@ exit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int validate_recv_ctrl_frame(struct adapter *padapter,
|
||||
struct recv_frame *precv_frame)
|
||||
static void validate_recv_ctrl_frame(struct adapter *padapter,
|
||||
struct recv_frame *precv_frame)
|
||||
{
|
||||
struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
u8 *pframe = precv_frame->rx_data;
|
||||
/* uint len = precv_frame->len; */
|
||||
|
||||
if (GetFrameType(pframe) != WIFI_CTRL_TYPE)
|
||||
return _FAIL;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data;
|
||||
struct ieee80211_pspoll *pspoll = (struct ieee80211_pspoll *)hdr;
|
||||
u8 wmmps_ac;
|
||||
struct sta_info *psta;
|
||||
|
||||
/* receive the frames that ra(a1) is my address */
|
||||
if (memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN))
|
||||
return _FAIL;
|
||||
if (memcmp(hdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN))
|
||||
return;
|
||||
|
||||
/* only handle ps-poll */
|
||||
if (GetFrameSubType(pframe) == WIFI_PSPOLL) {
|
||||
u16 aid;
|
||||
u8 wmmps_ac = 0;
|
||||
struct sta_info *psta = NULL;
|
||||
if (!ieee80211_is_pspoll(hdr->frame_control))
|
||||
return;
|
||||
|
||||
aid = GetAid(pframe);
|
||||
psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
|
||||
psta = rtw_get_stainfo(pstapriv, hdr->addr2);
|
||||
if (!psta || psta->aid != (le16_to_cpu(pspoll->aid) & 0x3FFF))
|
||||
return;
|
||||
|
||||
if (!psta || psta->aid != aid)
|
||||
return _FAIL;
|
||||
/* for rx pkt statistics */
|
||||
psta->sta_stats.rx_ctrl_pkts++;
|
||||
|
||||
/* for rx pkt statistics */
|
||||
psta->sta_stats.rx_ctrl_pkts++;
|
||||
|
||||
switch (pattrib->priority) {
|
||||
case 1:
|
||||
case 2:
|
||||
wmmps_ac = psta->uapsd_bk & BIT(0);
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
wmmps_ac = psta->uapsd_vi & BIT(0);
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
wmmps_ac = psta->uapsd_vo & BIT(0);
|
||||
break;
|
||||
case 0:
|
||||
case 3:
|
||||
default:
|
||||
wmmps_ac = psta->uapsd_be & BIT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (wmmps_ac)
|
||||
return _FAIL;
|
||||
|
||||
if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
|
||||
psta->expire_to = pstapriv->expire_to;
|
||||
psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
|
||||
}
|
||||
|
||||
if ((psta->state & WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap & BIT(psta->aid))) {
|
||||
struct list_head *xmitframe_plist, *xmitframe_phead;
|
||||
struct xmit_frame *pxmitframe = NULL;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
spin_lock_bh(&pxmitpriv->lock);
|
||||
|
||||
xmitframe_phead = get_list_head(&psta->sleep_q);
|
||||
xmitframe_plist = xmitframe_phead->next;
|
||||
|
||||
if (xmitframe_phead != xmitframe_plist) {
|
||||
pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list);
|
||||
|
||||
xmitframe_plist = xmitframe_plist->next;
|
||||
|
||||
list_del_init(&pxmitframe->list);
|
||||
|
||||
psta->sleepq_len--;
|
||||
|
||||
if (psta->sleepq_len > 0)
|
||||
pxmitframe->attrib.mdata = 1;
|
||||
else
|
||||
pxmitframe->attrib.mdata = 0;
|
||||
|
||||
pxmitframe->attrib.triggered = 1;
|
||||
|
||||
if (psta->sleepq_len == 0) {
|
||||
pstapriv->tim_bitmap &= ~BIT(psta->aid);
|
||||
|
||||
/* upate BCN for TIM IE */
|
||||
/* update_BCNTIM(padapter); */
|
||||
update_beacon(padapter, _TIM_IE_, NULL, false);
|
||||
}
|
||||
} else {
|
||||
if (pstapriv->tim_bitmap & BIT(psta->aid)) {
|
||||
if (psta->sleepq_len == 0)
|
||||
/* issue nulldata with More data bit = 0 to indicate we have no buffered packets */
|
||||
issue_nulldata(padapter, psta->hwaddr, 0, 0, 0);
|
||||
else
|
||||
psta->sleepq_len = 0;
|
||||
|
||||
pstapriv->tim_bitmap &= ~BIT(psta->aid);
|
||||
|
||||
/* upate BCN for TIM IE */
|
||||
/* update_BCNTIM(padapter); */
|
||||
update_beacon(padapter, _TIM_IE_, NULL, false);
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&pxmitpriv->lock);
|
||||
}
|
||||
switch (pattrib->priority) {
|
||||
case 1:
|
||||
case 2:
|
||||
wmmps_ac = psta->uapsd_bk & BIT(0);
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
wmmps_ac = psta->uapsd_vi & BIT(0);
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
wmmps_ac = psta->uapsd_vo & BIT(0);
|
||||
break;
|
||||
case 0:
|
||||
case 3:
|
||||
default:
|
||||
wmmps_ac = psta->uapsd_be & BIT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
return _FAIL;
|
||||
if (wmmps_ac)
|
||||
return;
|
||||
|
||||
if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
|
||||
psta->expire_to = pstapriv->expire_to;
|
||||
psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
|
||||
}
|
||||
|
||||
if ((psta->state & WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap & BIT(psta->aid))) {
|
||||
struct list_head *xmitframe_plist, *xmitframe_phead;
|
||||
struct xmit_frame *pxmitframe = NULL;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
||||
spin_lock_bh(&pxmitpriv->lock);
|
||||
|
||||
xmitframe_phead = get_list_head(&psta->sleep_q);
|
||||
xmitframe_plist = xmitframe_phead->next;
|
||||
|
||||
if (xmitframe_phead != xmitframe_plist) {
|
||||
pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list);
|
||||
|
||||
xmitframe_plist = xmitframe_plist->next;
|
||||
|
||||
list_del_init(&pxmitframe->list);
|
||||
|
||||
psta->sleepq_len--;
|
||||
|
||||
if (psta->sleepq_len > 0)
|
||||
pxmitframe->attrib.mdata = 1;
|
||||
else
|
||||
pxmitframe->attrib.mdata = 0;
|
||||
|
||||
pxmitframe->attrib.triggered = 1;
|
||||
|
||||
if (psta->sleepq_len == 0) {
|
||||
pstapriv->tim_bitmap &= ~BIT(psta->aid);
|
||||
|
||||
/* upate BCN for TIM IE */
|
||||
/* update_BCNTIM(padapter); */
|
||||
update_beacon(padapter, _TIM_IE_, NULL, false);
|
||||
}
|
||||
} else {
|
||||
if (pstapriv->tim_bitmap & BIT(psta->aid)) {
|
||||
if (psta->sleepq_len == 0)
|
||||
/* issue nulldata with More data bit = 0 to indicate we have no buffered packets */
|
||||
issue_nulldata(padapter, psta->hwaddr, 0, 0, 0);
|
||||
else
|
||||
psta->sleepq_len = 0;
|
||||
|
||||
pstapriv->tim_bitmap &= ~BIT(psta->aid);
|
||||
|
||||
/* upate BCN for TIM IE */
|
||||
/* update_BCNTIM(padapter); */
|
||||
update_beacon(padapter, _TIM_IE_, NULL, false);
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&pxmitpriv->lock);
|
||||
}
|
||||
}
|
||||
|
||||
struct recv_frame *recvframe_chk_defrag(struct adapter *padapter, struct recv_frame *precv_frame);
|
||||
|
||||
static int validate_recv_mgnt_frame(struct adapter *padapter,
|
||||
struct recv_frame *precv_frame)
|
||||
static void validate_recv_mgnt_frame(struct adapter *padapter,
|
||||
struct recv_frame *precv_frame)
|
||||
{
|
||||
struct sta_info *psta;
|
||||
struct ieee80211_hdr *hdr;
|
||||
|
||||
precv_frame = recvframe_chk_defrag(padapter, precv_frame);
|
||||
if (!precv_frame)
|
||||
return _SUCCESS;
|
||||
return;
|
||||
|
||||
/* for rx pkt statistics */
|
||||
psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(precv_frame->rx_data));
|
||||
hdr = (struct ieee80211_hdr *)precv_frame->rx_data;
|
||||
psta = rtw_get_stainfo(&padapter->stapriv, hdr->addr2);
|
||||
if (psta) {
|
||||
psta->sta_stats.rx_mgnt_pkts++;
|
||||
if (GetFrameSubType(precv_frame->rx_data) == WIFI_BEACON) {
|
||||
if (ieee80211_is_beacon(hdr->frame_control))
|
||||
psta->sta_stats.rx_beacon_pkts++;
|
||||
} else if (GetFrameSubType(precv_frame->rx_data) == WIFI_PROBEREQ) {
|
||||
else if (ieee80211_is_probe_req(hdr->frame_control))
|
||||
psta->sta_stats.rx_probereq_pkts++;
|
||||
} else if (GetFrameSubType(precv_frame->rx_data) == WIFI_PROBERSP) {
|
||||
if (!memcmp(padapter->eeprompriv.mac_addr, GetAddr1Ptr(precv_frame->rx_data), ETH_ALEN))
|
||||
else if (ieee80211_is_probe_resp(hdr->frame_control)) {
|
||||
if (!memcmp(padapter->eeprompriv.mac_addr, hdr->addr1, ETH_ALEN))
|
||||
psta->sta_stats.rx_probersp_pkts++;
|
||||
else if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->rx_data)) ||
|
||||
is_multicast_mac_addr(GetAddr1Ptr(precv_frame->rx_data)))
|
||||
else if (is_broadcast_mac_addr(hdr->addr1) || is_multicast_mac_addr(hdr->addr1))
|
||||
psta->sta_stats.rx_probersp_bm_pkts++;
|
||||
else
|
||||
psta->sta_stats.rx_probersp_uo_pkts++;
|
||||
|
|
@ -939,72 +928,44 @@ static int validate_recv_mgnt_frame(struct adapter *padapter,
|
|||
}
|
||||
|
||||
mgt_dispatcher(padapter, precv_frame);
|
||||
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static int validate_recv_data_frame(struct adapter *adapter,
|
||||
struct recv_frame *precv_frame)
|
||||
{
|
||||
u8 bretry;
|
||||
u8 *psa, *pda, *pbssid;
|
||||
struct sta_info *psta = NULL;
|
||||
u8 *ptr = precv_frame->rx_data;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data;
|
||||
struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
|
||||
struct security_priv *psecuritypriv = &adapter->securitypriv;
|
||||
int ret = _SUCCESS;
|
||||
int ret;
|
||||
|
||||
bretry = GetRetry(ptr);
|
||||
pda = get_da(ptr);
|
||||
psa = get_sa(ptr);
|
||||
pbssid = get_hdr_bssid(ptr);
|
||||
memcpy(pattrib->dst, ieee80211_get_DA(hdr), ETH_ALEN);
|
||||
memcpy(pattrib->src, ieee80211_get_SA(hdr), ETH_ALEN);
|
||||
|
||||
if (!pbssid) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
/* address4 is used only if both to_ds and from_ds are set */
|
||||
if (ieee80211_has_a4(hdr->frame_control))
|
||||
return _FAIL;
|
||||
|
||||
memcpy(pattrib->dst, pda, ETH_ALEN);
|
||||
memcpy(pattrib->src, psa, ETH_ALEN);
|
||||
memcpy(pattrib->ra, hdr->addr1, ETH_ALEN);
|
||||
memcpy(pattrib->ta, hdr->addr2, ETH_ALEN);
|
||||
|
||||
memcpy(pattrib->bssid, pbssid, ETH_ALEN);
|
||||
|
||||
switch (pattrib->to_fr_ds) {
|
||||
case 0:
|
||||
memcpy(pattrib->ra, pda, ETH_ALEN);
|
||||
memcpy(pattrib->ta, psa, ETH_ALEN);
|
||||
ret = sta2sta_data_frame(adapter, precv_frame, &psta);
|
||||
break;
|
||||
case 1:
|
||||
memcpy(pattrib->ra, pda, ETH_ALEN);
|
||||
memcpy(pattrib->ta, pbssid, ETH_ALEN);
|
||||
if (ieee80211_has_fromds(hdr->frame_control)) {
|
||||
memcpy(pattrib->bssid, hdr->addr2, ETH_ALEN);
|
||||
ret = ap2sta_data_frame(adapter, precv_frame, &psta);
|
||||
break;
|
||||
case 2:
|
||||
memcpy(pattrib->ra, pbssid, ETH_ALEN);
|
||||
memcpy(pattrib->ta, psa, ETH_ALEN);
|
||||
} else if (ieee80211_has_tods(hdr->frame_control)) {
|
||||
memcpy(pattrib->bssid, hdr->addr1, ETH_ALEN);
|
||||
ret = sta2ap_data_frame(adapter, precv_frame, &psta);
|
||||
break;
|
||||
case 3:
|
||||
memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
|
||||
memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);
|
||||
ret = _FAIL;
|
||||
break;
|
||||
default:
|
||||
ret = _FAIL;
|
||||
break;
|
||||
} else {
|
||||
memcpy(pattrib->bssid, hdr->addr3, ETH_ALEN);
|
||||
ret = sta2sta_data_frame(adapter, precv_frame, &psta);
|
||||
}
|
||||
|
||||
if (ret == _FAIL) {
|
||||
goto exit;
|
||||
} else if (ret == RTW_RX_HANDLED) {
|
||||
goto exit;
|
||||
}
|
||||
if (ret == _FAIL || ret == RTW_RX_HANDLED)
|
||||
return ret;
|
||||
|
||||
if (!psta) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
if (!psta)
|
||||
return _FAIL;
|
||||
|
||||
/* psta->rssi = prxcmd->rssi; */
|
||||
/* psta->signal_quality = prxcmd->sq; */
|
||||
|
|
@ -1014,16 +975,16 @@ static int validate_recv_data_frame(struct adapter *adapter,
|
|||
pattrib->ack_policy = 0;
|
||||
/* parsing QC field */
|
||||
if (pattrib->qos) {
|
||||
pattrib->priority = GetPriority((ptr + 24));
|
||||
pattrib->priority = ieee80211_get_tid(hdr);
|
||||
pattrib->ack_policy = GetAckpolicy((ptr + 24));
|
||||
pattrib->amsdu = GetAMsdu((ptr + 24));
|
||||
pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 32 : 26;
|
||||
pattrib->hdrlen = 26;
|
||||
|
||||
if (pattrib->priority != 0 && pattrib->priority != 3)
|
||||
adapter->recvpriv.bIsAnyNonBEPkts = true;
|
||||
} else {
|
||||
pattrib->priority = 0;
|
||||
pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 30 : 24;
|
||||
pattrib->hdrlen = 24;
|
||||
}
|
||||
|
||||
if (pattrib->order)/* HT-CTRL 11n */
|
||||
|
|
@ -1032,10 +993,9 @@ static int validate_recv_data_frame(struct adapter *adapter,
|
|||
precv_frame->preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority];
|
||||
|
||||
/* decache, drop duplicate recv packets */
|
||||
if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) {
|
||||
ret = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
if (recv_decache(precv_frame, ieee80211_has_retry(hdr->frame_control),
|
||||
&psta->sta_recvpriv.rxcache) == _FAIL)
|
||||
return _FAIL;
|
||||
|
||||
if (pattrib->privacy) {
|
||||
GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, is_multicast_ether_addr(pattrib->ra));
|
||||
|
|
@ -1047,9 +1007,7 @@ static int validate_recv_data_frame(struct adapter *adapter,
|
|||
pattrib->icv_len = 0;
|
||||
}
|
||||
|
||||
exit:
|
||||
|
||||
return ret;
|
||||
return _SUCCESS;
|
||||
}
|
||||
|
||||
static int validate_recv_frame(struct adapter *adapter, struct recv_frame *precv_frame)
|
||||
|
|
@ -1059,11 +1017,8 @@ static int validate_recv_frame(struct adapter *adapter, struct recv_frame *precv
|
|||
/* then call check if rx seq/frag. duplicated. */
|
||||
|
||||
int retval = _FAIL;
|
||||
u8 bDumpRxPkt;
|
||||
struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
|
||||
u8 *ptr = precv_frame->rx_data;
|
||||
__le16 fc = *(__le16 *)ptr;
|
||||
u8 ver = (unsigned char)(*ptr) & 0x3;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data;
|
||||
struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
|
||||
|
||||
if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
|
||||
|
|
@ -1072,32 +1027,26 @@ static int validate_recv_frame(struct adapter *adapter, struct recv_frame *precv
|
|||
pmlmeext->channel_set[ch_set_idx].rx_count++;
|
||||
}
|
||||
|
||||
/* add version chk */
|
||||
if (ver != 0)
|
||||
if ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_VERS)) != 0)
|
||||
return _FAIL;
|
||||
|
||||
pattrib->to_fr_ds = get_tofr_ds(ptr);
|
||||
pattrib->frag_num = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG;
|
||||
pattrib->seq_num = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
|
||||
|
||||
pattrib->frag_num = GetFragNum(ptr);
|
||||
pattrib->seq_num = GetSequence(ptr);
|
||||
|
||||
pattrib->pw_save = GetPwrMgt(ptr);
|
||||
pattrib->mfrag = ieee80211_has_morefrags(fc);
|
||||
pattrib->mdata = ieee80211_has_moredata(fc);
|
||||
pattrib->privacy = ieee80211_has_protected(fc);
|
||||
pattrib->order = ieee80211_has_order(fc);
|
||||
|
||||
/* Dump rx packets */
|
||||
GetHalDefVar8188EUsb(adapter, HAL_DEF_DBG_DUMP_RXPKT, &bDumpRxPkt);
|
||||
pattrib->pw_save = ieee80211_has_pm(hdr->frame_control);
|
||||
pattrib->mfrag = ieee80211_has_morefrags(hdr->frame_control);
|
||||
pattrib->mdata = ieee80211_has_moredata(hdr->frame_control);
|
||||
pattrib->privacy = ieee80211_has_protected(hdr->frame_control);
|
||||
pattrib->order = ieee80211_has_order(hdr->frame_control);
|
||||
|
||||
/* We return _SUCCESS only for data frames. */
|
||||
if (ieee80211_is_mgmt(fc))
|
||||
if (ieee80211_is_mgmt(hdr->frame_control))
|
||||
validate_recv_mgnt_frame(adapter, precv_frame);
|
||||
else if (ieee80211_is_ctl(fc))
|
||||
else if (ieee80211_is_ctl(hdr->frame_control))
|
||||
validate_recv_ctrl_frame(adapter, precv_frame);
|
||||
else if (ieee80211_is_data(fc)) {
|
||||
else if (ieee80211_is_data(hdr->frame_control)) {
|
||||
rtw_led_control(adapter, LED_CTL_RX);
|
||||
pattrib->qos = ieee80211_is_data_qos(fc);
|
||||
pattrib->qos = ieee80211_is_data_qos(hdr->frame_control);
|
||||
retval = validate_recv_data_frame(adapter, precv_frame);
|
||||
if (retval == _FAIL) {
|
||||
struct recv_priv *precvpriv = &adapter->recvpriv;
|
||||
|
|
@ -1284,8 +1233,9 @@ struct recv_frame *recvframe_chk_defrag(struct adapter *padapter, struct recv_fr
|
|||
psta_addr = pfhdr->attrib.ta;
|
||||
psta = rtw_get_stainfo(pstapriv, psta_addr);
|
||||
if (!psta) {
|
||||
u8 type = GetFrameType(pfhdr->rx_data);
|
||||
if (type != WIFI_DATA_TYPE) {
|
||||
__le16 fc = *(__le16 *)pfhdr->rx_data;
|
||||
|
||||
if (ieee80211_is_data(fc)) {
|
||||
psta = rtw_get_bcmc_stainfo(padapter);
|
||||
pdefrag_q = &psta->sta_recvpriv.defrag_q;
|
||||
} else {
|
||||
|
|
@ -1723,12 +1673,9 @@ static int recv_func_prehandle(struct adapter *padapter, struct recv_frame *rfra
|
|||
|
||||
/* check the frame crtl field and decache */
|
||||
ret = validate_recv_frame(padapter, rframe);
|
||||
if (ret != _SUCCESS) {
|
||||
if (ret != _SUCCESS)
|
||||
rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
|
||||
goto exit;
|
||||
}
|
||||
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ void rtw_wep_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe)
|
|||
arc4_crypt(ctx, payload + length, crc.f1, 4);
|
||||
|
||||
pframe += pxmitpriv->frag_len;
|
||||
pframe = (u8 *)RND4((size_t)(pframe));
|
||||
pframe = PTR_ALIGN(pframe, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -504,7 +504,7 @@ u32 rtw_tkip_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe)
|
|||
arc4_crypt(ctx, payload + length, crc.f1, 4);
|
||||
|
||||
pframe += pxmitpriv->frag_len;
|
||||
pframe = (u8 *)RND4((size_t)(pframe));
|
||||
pframe = PTR_ALIGN(pframe, 4);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -1133,7 +1133,7 @@ u32 rtw_aes_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe)
|
|||
|
||||
aes_cipher(prwskey, pattrib->hdrlen, pframe, length);
|
||||
pframe += pxmitpriv->frag_len;
|
||||
pframe = (u8 *)RND4((size_t)(pframe));
|
||||
pframe = PTR_ALIGN(pframe, 4);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -470,9 +470,9 @@ u8 rtw_access_ctrl(struct adapter *padapter, u8 *mac_addr)
|
|||
spin_unlock_bh(&pacl_node_q->lock);
|
||||
|
||||
if (pacl_list->mode == 1)/* accept unless in deny list */
|
||||
res = (match) ? false : true;
|
||||
res = !match;
|
||||
else if (pacl_list->mode == 2)/* deny unless in accept list */
|
||||
res = (match) ? true : false;
|
||||
res = match;
|
||||
else
|
||||
res = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -276,14 +276,6 @@ void Restore_DM_Func_Flag(struct adapter *padapter)
|
|||
SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&saveflag));
|
||||
}
|
||||
|
||||
void Switch_DM_Func(struct adapter *padapter, u32 mode, u8 enable)
|
||||
{
|
||||
if (enable)
|
||||
SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode));
|
||||
else
|
||||
SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode));
|
||||
}
|
||||
|
||||
void Set_MSR(struct adapter *padapter, u8 type)
|
||||
{
|
||||
u8 val8;
|
||||
|
|
@ -511,6 +503,31 @@ int WMM_param_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void set_acm_ctrl(struct adapter *adapter, u8 acm_mask)
|
||||
{
|
||||
u8 acmctrl = rtw_read8(adapter, REG_ACMHWCTRL);
|
||||
|
||||
if (acm_mask > 1)
|
||||
acmctrl = acmctrl | 0x1;
|
||||
|
||||
if (acm_mask & BIT(3))
|
||||
acmctrl |= ACMHW_VOQEN;
|
||||
else
|
||||
acmctrl &= (~ACMHW_VOQEN);
|
||||
|
||||
if (acm_mask & BIT(2))
|
||||
acmctrl |= ACMHW_VIQEN;
|
||||
else
|
||||
acmctrl &= (~ACMHW_VIQEN);
|
||||
|
||||
if (acm_mask & BIT(1))
|
||||
acmctrl |= ACMHW_BEQEN;
|
||||
else
|
||||
acmctrl &= (~ACMHW_BEQEN);
|
||||
|
||||
rtw_write8(adapter, REG_ACMHWCTRL, acmctrl);
|
||||
}
|
||||
|
||||
void WMMOnAssocRsp(struct adapter *padapter)
|
||||
{
|
||||
u8 ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime;
|
||||
|
|
@ -522,6 +539,7 @@ void WMMOnAssocRsp(struct adapter *padapter)
|
|||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct registry_priv *pregpriv = &padapter->registrypriv;
|
||||
struct hal_data_8188e *haldata = &padapter->haldata;
|
||||
|
||||
if (pmlmeinfo->WMM_enable == 0) {
|
||||
padapter->mlmepriv.acm_mask = 0;
|
||||
|
|
@ -550,7 +568,8 @@ void WMMOnAssocRsp(struct adapter *padapter)
|
|||
|
||||
switch (ACI) {
|
||||
case 0x0:
|
||||
SetHwReg8188EU(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));
|
||||
haldata->AcParam_BE = acParm;
|
||||
rtw_write32(padapter, REG_EDCA_BE_PARAM, acParm);
|
||||
acm_mask |= (ACM ? BIT(1) : 0);
|
||||
edca[XMIT_BE_QUEUE] = acParm;
|
||||
break;
|
||||
|
|
@ -572,7 +591,7 @@ void WMMOnAssocRsp(struct adapter *padapter)
|
|||
}
|
||||
|
||||
if (padapter->registrypriv.acm_method == 1)
|
||||
SetHwReg8188EU(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask));
|
||||
set_acm_ctrl(padapter, acm_mask);
|
||||
else
|
||||
padapter->mlmepriv.acm_mask = acm_mask;
|
||||
|
||||
|
|
@ -743,6 +762,35 @@ void HT_info_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE)
|
|||
memcpy(&pmlmeinfo->HT_info, pIE->data, pIE->Length);
|
||||
}
|
||||
|
||||
static void set_min_ampdu_spacing(struct adapter *adapter, u8 spacing)
|
||||
{
|
||||
u8 sec_spacing;
|
||||
|
||||
if (spacing <= 7) {
|
||||
switch (adapter->securitypriv.dot11PrivacyAlgrthm) {
|
||||
case _NO_PRIVACY_:
|
||||
case _AES_:
|
||||
sec_spacing = 0;
|
||||
break;
|
||||
case _WEP40_:
|
||||
case _WEP104_:
|
||||
case _TKIP_:
|
||||
case _TKIP_WTMIC_:
|
||||
sec_spacing = 6;
|
||||
break;
|
||||
default:
|
||||
sec_spacing = 7;
|
||||
break;
|
||||
}
|
||||
|
||||
if (spacing < sec_spacing)
|
||||
spacing = sec_spacing;
|
||||
|
||||
rtw_write8(adapter, REG_AMPDU_MIN_SPACE,
|
||||
(rtw_read8(adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | spacing);
|
||||
}
|
||||
}
|
||||
|
||||
void HTOnAssocRsp(struct adapter *padapter)
|
||||
{
|
||||
unsigned char max_AMPDU_len;
|
||||
|
|
@ -767,7 +815,7 @@ void HTOnAssocRsp(struct adapter *padapter)
|
|||
|
||||
min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;
|
||||
|
||||
SetHwReg8188EU(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));
|
||||
set_min_ampdu_spacing(padapter, min_MPDU_spacing);
|
||||
|
||||
SetHwReg8188EU(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));
|
||||
}
|
||||
|
|
@ -846,7 +894,7 @@ int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len)
|
|||
if (!is_client_associated_to_ap(Adapter))
|
||||
return true;
|
||||
|
||||
len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
len = packet_len - sizeof(struct ieee80211_hdr_3addr);
|
||||
|
||||
if (len > MAX_IE_SZ)
|
||||
return _FAIL;
|
||||
|
|
@ -867,7 +915,7 @@ int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len)
|
|||
|
||||
/* below is to copy the information element */
|
||||
bssid->IELength = len;
|
||||
memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength);
|
||||
memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength);
|
||||
|
||||
/* check bw and channel offset */
|
||||
/* parsing HT_CAP_IE */
|
||||
|
|
@ -916,7 +964,7 @@ int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len)
|
|||
else
|
||||
hidden_ssid = false;
|
||||
|
||||
if ((NULL != p) && (false == hidden_ssid && (*(p + 1)))) {
|
||||
if (p && (!hidden_ssid && (*(p + 1)))) {
|
||||
memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1));
|
||||
bssid->Ssid.SsidLength = *(p + 1);
|
||||
} else {
|
||||
|
|
@ -1275,14 +1323,10 @@ void update_IOT_info(struct adapter *padapter)
|
|||
case HT_IOT_PEER_RALINK:
|
||||
pmlmeinfo->turboMode_cts2self = 0;
|
||||
pmlmeinfo->turboMode_rtsen = 1;
|
||||
/* disable high power */
|
||||
Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), false);
|
||||
break;
|
||||
case HT_IOT_PEER_REALTEK:
|
||||
/* rtw_write16(padapter, 0x4cc, 0xffff); */
|
||||
/* rtw_write16(padapter, 0x546, 0x01c0); */
|
||||
/* disable high power */
|
||||
Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), false);
|
||||
break;
|
||||
default:
|
||||
pmlmeinfo->turboMode_cts2self = 0;
|
||||
|
|
@ -1291,26 +1335,36 @@ void update_IOT_info(struct adapter *padapter)
|
|||
}
|
||||
}
|
||||
|
||||
static void set_ack_preamble(struct adapter *adapter, bool short_preamble)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &adapter->haldata;
|
||||
u8 val8;
|
||||
|
||||
/* Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) */
|
||||
val8 = haldata->nCur40MhzPrimeSC << 5;
|
||||
if (short_preamble)
|
||||
val8 |= 0x80;
|
||||
|
||||
rtw_write8(adapter, REG_RRSR + 2, val8);
|
||||
};
|
||||
|
||||
void update_capinfo(struct adapter *Adapter, u16 updateCap)
|
||||
{
|
||||
struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
bool ShortPreamble;
|
||||
|
||||
/* Check preamble mode, 2005.01.06, by rcnjko. */
|
||||
/* Mark to update preamble value forever, 2008.03.18 by lanhsin */
|
||||
|
||||
if (updateCap & cShortPreamble) { /* Short Preamble */
|
||||
if (pmlmeinfo->preamble_mode != PREAMBLE_SHORT) { /* PREAMBLE_LONG or PREAMBLE_AUTO */
|
||||
ShortPreamble = true;
|
||||
pmlmeinfo->preamble_mode = PREAMBLE_SHORT;
|
||||
SetHwReg8188EU(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble);
|
||||
set_ack_preamble(Adapter, true);
|
||||
}
|
||||
} else { /* Long Preamble */
|
||||
if (pmlmeinfo->preamble_mode != PREAMBLE_LONG) { /* PREAMBLE_SHORT or PREAMBLE_AUTO */
|
||||
ShortPreamble = false;
|
||||
pmlmeinfo->preamble_mode = PREAMBLE_LONG;
|
||||
SetHwReg8188EU(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble);
|
||||
set_ack_preamble(Adapter, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1338,7 +1392,6 @@ void update_capinfo(struct adapter *Adapter, u16 updateCap)
|
|||
void update_wireless_mode(struct adapter *padapter)
|
||||
{
|
||||
int ratelen, network_type = 0;
|
||||
u32 SIFS_Timer;
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
|
||||
|
|
@ -1365,10 +1418,12 @@ void update_wireless_mode(struct adapter *padapter)
|
|||
|
||||
pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode;
|
||||
|
||||
SIFS_Timer = 0x0a0a0808;/* 0x0808 -> for CCK, 0x0a0a -> for OFDM */
|
||||
/* change this value if having IOT issues. */
|
||||
|
||||
SetHwReg8188EU(padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer);
|
||||
/* RESP_SIFS for CCK */
|
||||
rtw_write8(padapter, REG_R2T_SIFS, 0x08);
|
||||
rtw_write8(padapter, REG_R2T_SIFS + 1, 0x08);
|
||||
/* RESP_SIFS for OFDM */
|
||||
rtw_write8(padapter, REG_T2T_SIFS, 0x0a);
|
||||
rtw_write8(padapter, REG_T2T_SIFS + 1, 0x0a);
|
||||
|
||||
if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
|
||||
update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);
|
||||
|
|
@ -1411,34 +1466,12 @@ int update_sta_support_rate(struct adapter *padapter, u8 *pvar_ie, uint var_ie_l
|
|||
return _SUCCESS;
|
||||
}
|
||||
|
||||
void process_addba_req(struct adapter *padapter, u8 *paddba_req, u8 *addr)
|
||||
{
|
||||
struct sta_info *psta;
|
||||
u16 tid;
|
||||
u16 param;
|
||||
struct recv_reorder_ctrl *preorder_ctrl;
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
struct ADDBA_request *preq = (struct ADDBA_request *)paddba_req;
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
|
||||
psta = rtw_get_stainfo(pstapriv, addr);
|
||||
|
||||
if (psta) {
|
||||
param = le16_to_cpu(preq->BA_para_set);
|
||||
tid = (param >> 2) & 0x0f;
|
||||
preorder_ctrl = &psta->recvreorder_ctrl[tid];
|
||||
preorder_ctrl->indicate_seq = 0xffff;
|
||||
preorder_ctrl->enable = (pmlmeinfo->bAcceptAddbaReq) ? true : false;
|
||||
}
|
||||
}
|
||||
|
||||
void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)
|
||||
{
|
||||
u8 *pIE;
|
||||
__le32 *pbuf;
|
||||
|
||||
pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pIE = pframe + sizeof(struct ieee80211_hdr_3addr);
|
||||
pbuf = (__le32 *)pIE;
|
||||
|
||||
pmlmeext->TSFValue = le32_to_cpu(*(pbuf + 1));
|
||||
|
|
|
|||
|
|
@ -52,8 +52,8 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter)
|
|||
sema_init(&pxmitpriv->terminate_xmitthread_sema, 0);
|
||||
|
||||
/*
|
||||
Please insert all the queue initializaiton using rtw_init_queue below
|
||||
*/
|
||||
* Please insert all the queue initializaiton using rtw_init_queue below
|
||||
*/
|
||||
|
||||
pxmitpriv->adapter = padapter;
|
||||
|
||||
|
|
@ -66,10 +66,10 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter)
|
|||
rtw_init_queue(&pxmitpriv->free_xmit_queue);
|
||||
|
||||
/*
|
||||
Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
|
||||
and initialize free_xmit_frame below.
|
||||
Please also apply free_txobj to link_up all the xmit_frames...
|
||||
*/
|
||||
* Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
|
||||
* and initialize free_xmit_frame below.
|
||||
* Please also apply free_txobj to link_up all the xmit_frames...
|
||||
*/
|
||||
|
||||
pxmitpriv->pallocated_frame_buf = vzalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
|
||||
|
||||
|
|
@ -178,7 +178,12 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter)
|
|||
|
||||
pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;
|
||||
|
||||
rtw_alloc_hwxmits(padapter);
|
||||
res = rtw_alloc_hwxmits(padapter);
|
||||
if (res) {
|
||||
res = _FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
|
|
@ -399,7 +404,7 @@ static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
|
|||
|
||||
pattrib->priority = user_prio;
|
||||
pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
|
||||
pattrib->subtype = WIFI_QOS_DATA_TYPE;
|
||||
pattrib->subtype = IEEE80211_STYPE_QOS_DATA | IEEE80211_FTYPE_DATA;
|
||||
}
|
||||
|
||||
static s32 update_attrib(struct adapter *padapter, struct sk_buff *pkt, struct pkt_attrib *pattrib)
|
||||
|
|
@ -448,14 +453,12 @@ static s32 update_attrib(struct adapter *padapter, struct sk_buff *pkt, struct p
|
|||
_rtw_pktfile_read(&pktfile, &tmp[0], 24);
|
||||
pattrib->dhcp_pkt = 0;
|
||||
if (pktfile.pkt_len > 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */
|
||||
if (ETH_P_IP == pattrib->ether_type) {/* IP header */
|
||||
if (((tmp[21] == 68) && (tmp[23] == 67)) ||
|
||||
((tmp[21] == 67) && (tmp[23] == 68))) {
|
||||
/* 68 : UDP BOOTP client */
|
||||
/* 67 : UDP BOOTP server */
|
||||
/* Use low rate to send DHCP packet. */
|
||||
pattrib->dhcp_pkt = 1;
|
||||
}
|
||||
if (((tmp[21] == 68) && (tmp[23] == 67)) ||
|
||||
((tmp[21] == 67) && (tmp[23] == 68))) {
|
||||
/* 68 : UDP BOOTP client */
|
||||
/* 67 : UDP BOOTP server */
|
||||
/* Use low rate to send DHCP packet. */
|
||||
pattrib->dhcp_pkt = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -497,7 +500,7 @@ static s32 update_attrib(struct adapter *padapter, struct sk_buff *pkt, struct p
|
|||
pattrib->pkt_hdrlen = ETH_HLEN;/* pattrib->ether_type == 0x8100) ? (14 + 4): 14; vlan tag */
|
||||
|
||||
pattrib->hdrlen = WLAN_HDR_A3_LEN;
|
||||
pattrib->subtype = WIFI_DATA_TYPE;
|
||||
pattrib->subtype = IEEE80211_FTYPE_DATA;
|
||||
pattrib->priority = 0;
|
||||
|
||||
if (check_fwstate(pmlmepriv, WIFI_AP_STATE | WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) {
|
||||
|
|
@ -642,7 +645,7 @@ static s32 xmitframe_addmic(struct adapter *padapter, struct xmit_frame *pxmitfr
|
|||
payload = pframe;
|
||||
|
||||
for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
|
||||
payload = (u8 *)RND4((size_t)(payload));
|
||||
payload = PTR_ALIGN(payload, 4);
|
||||
|
||||
payload = payload + pattrib->hdrlen + pattrib->iv_len;
|
||||
if ((curfragnum + 1) == pattrib->nr_frags) {
|
||||
|
|
@ -696,13 +699,13 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
|
|||
{
|
||||
u16 *qc;
|
||||
|
||||
struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
|
||||
struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct qos_priv *pqospriv = &pmlmepriv->qospriv;
|
||||
u8 qos_option = false;
|
||||
|
||||
int res = _SUCCESS;
|
||||
__le16 *fctrl = &pwlanhdr->frame_ctl;
|
||||
__le16 *fctrl = &pwlanhdr->frame_control;
|
||||
|
||||
struct sta_info *psta;
|
||||
|
||||
|
|
@ -717,7 +720,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
|
|||
|
||||
SetFrameSubType(fctrl, pattrib->subtype);
|
||||
|
||||
if (pattrib->subtype & WIFI_DATA_TYPE) {
|
||||
if (pattrib->subtype & IEEE80211_FTYPE_DATA) {
|
||||
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
|
||||
/* to_ds = 1, fr_ds = 0; */
|
||||
/* Data transfer to AP */
|
||||
|
|
@ -853,22 +856,19 @@ s32 rtw_txframes_sta_ac_pending(struct adapter *padapter, struct pkt_attrib *pat
|
|||
}
|
||||
|
||||
/*
|
||||
|
||||
This sub-routine will perform all the following:
|
||||
|
||||
1. remove 802.3 header.
|
||||
2. create wlan_header, based on the info in pxmitframe
|
||||
3. append sta's iv/ext-iv
|
||||
4. append LLC
|
||||
5. move frag chunk from pframe to pxmitframe->mem
|
||||
6. apply sw-encrypt, if necessary.
|
||||
|
||||
*/
|
||||
* This sub-routine will perform all the following:
|
||||
*
|
||||
* 1. remove 802.3 header.
|
||||
* 2. create wlan_header, based on the info in pxmitframe
|
||||
* 3. append sta's iv/ext-iv
|
||||
* 4. append LLC
|
||||
* 5. move frag chunk from pframe to pxmitframe->mem
|
||||
* 6. apply sw-encrypt, if necessary.
|
||||
*/
|
||||
s32 rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct xmit_frame *pxmitframe)
|
||||
{
|
||||
struct pkt_file pktfile;
|
||||
s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
|
||||
size_t addr;
|
||||
u8 *pframe, *mem_start;
|
||||
u8 hw_hdr_offset;
|
||||
struct sta_info *psta;
|
||||
|
|
@ -985,9 +985,7 @@ s32 rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct
|
|||
break;
|
||||
}
|
||||
|
||||
addr = (size_t)(pframe);
|
||||
|
||||
mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset;
|
||||
mem_start = PTR_ALIGN(pframe, 4) + hw_hdr_offset;
|
||||
memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
|
||||
}
|
||||
|
||||
|
|
@ -1210,24 +1208,22 @@ s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
|
|||
}
|
||||
|
||||
/*
|
||||
Calling context:
|
||||
1. OS_TXENTRY
|
||||
2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
|
||||
|
||||
If we turn on USE_RXTHREAD, then, no need for critical section.
|
||||
Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
|
||||
|
||||
Must be very very cautious...
|
||||
|
||||
*/
|
||||
|
||||
* Calling context:
|
||||
* 1. OS_TXENTRY
|
||||
* 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
|
||||
*
|
||||
* If we turn on USE_RXTHREAD, then, no need for critical section.
|
||||
* Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
|
||||
*
|
||||
* Must be very very cautious...
|
||||
*/
|
||||
struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)/* _queue *pfree_xmit_queue) */
|
||||
{
|
||||
/*
|
||||
Please remember to use all the osdep_service api,
|
||||
and lock/unlock or _enter/_exit critical to protect
|
||||
pfree_xmit_queue
|
||||
*/
|
||||
* Please remember to use all the osdep_service api,
|
||||
* and lock/unlock or _enter/_exit critical to protect
|
||||
* pfree_xmit_queue
|
||||
*/
|
||||
|
||||
struct xmit_frame *pxframe = NULL;
|
||||
struct list_head *plist, *phead;
|
||||
|
|
@ -1474,7 +1470,7 @@ exit:
|
|||
return res;
|
||||
}
|
||||
|
||||
void rtw_alloc_hwxmits(struct adapter *padapter)
|
||||
int rtw_alloc_hwxmits(struct adapter *padapter)
|
||||
{
|
||||
struct hw_xmit *hwxmits;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
|
|
@ -1482,6 +1478,8 @@ void rtw_alloc_hwxmits(struct adapter *padapter)
|
|||
pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
|
||||
|
||||
pxmitpriv->hwxmits = kzalloc(sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry, GFP_KERNEL);
|
||||
if (!pxmitpriv->hwxmits)
|
||||
return -ENOMEM;
|
||||
|
||||
hwxmits = pxmitpriv->hwxmits;
|
||||
|
||||
|
|
@ -1498,6 +1496,8 @@ void rtw_alloc_hwxmits(struct adapter *padapter)
|
|||
hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
|
||||
} else {
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rtw_free_hwxmits(struct adapter *padapter)
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ enum HAL_STATUS ODM_ReadAndConfig_AGC_TAB_1T_8188E(struct odm_dm_struct *dm_odm)
|
|||
{
|
||||
u32 hex = 0;
|
||||
u32 i = 0;
|
||||
u32 arraylen = sizeof(array_agc_tab_1t_8188e) / sizeof(u32);
|
||||
u32 arraylen = ARRAY_SIZE(array_agc_tab_1t_8188e);
|
||||
u32 *array = array_agc_tab_1t_8188e;
|
||||
bool biol = false;
|
||||
struct adapter *adapter = dm_odm->Adapter;
|
||||
|
|
@ -446,7 +446,7 @@ enum HAL_STATUS ODM_ReadAndConfig_PHY_REG_1T_8188E(struct odm_dm_struct *dm_odm)
|
|||
{
|
||||
u32 hex = 0;
|
||||
u32 i = 0;
|
||||
u32 arraylen = sizeof(array_phy_reg_1t_8188e) / sizeof(u32);
|
||||
u32 arraylen = ARRAY_SIZE(array_phy_reg_1t_8188e);
|
||||
u32 *array = array_phy_reg_1t_8188e;
|
||||
bool biol = false;
|
||||
struct adapter *adapter = dm_odm->Adapter;
|
||||
|
|
@ -651,7 +651,7 @@ void ODM_ReadAndConfig_PHY_REG_PG_8188E(struct odm_dm_struct *dm_odm)
|
|||
{
|
||||
u32 hex;
|
||||
u32 i = 0;
|
||||
u32 arraylen = sizeof(array_phy_reg_pg_8188e) / sizeof(u32);
|
||||
u32 arraylen = ARRAY_SIZE(array_phy_reg_pg_8188e);
|
||||
u32 *array = array_phy_reg_pg_8188e;
|
||||
|
||||
hex = ODM_ITRF_USB << 8;
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ enum HAL_STATUS ODM_ReadAndConfig_MAC_REG_8188E(struct odm_dm_struct *dm_odm)
|
|||
|
||||
u32 hex = 0;
|
||||
u32 i;
|
||||
u32 array_len = sizeof(array_MAC_REG_8188E) / sizeof(u32);
|
||||
u32 array_len = ARRAY_SIZE(array_MAC_REG_8188E);
|
||||
u32 *array = array_MAC_REG_8188E;
|
||||
bool biol = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ enum HAL_STATUS ODM_ReadAndConfig_RadioA_1T_8188E(struct odm_dm_struct *pDM_Odm)
|
|||
|
||||
u32 hex = 0;
|
||||
u32 i = 0;
|
||||
u32 ArrayLen = sizeof(Array_RadioA_1T_8188E) / sizeof(u32);
|
||||
u32 ArrayLen = ARRAY_SIZE(Array_RadioA_1T_8188E);
|
||||
u32 *Array = Array_RadioA_1T_8188E;
|
||||
bool biol = false;
|
||||
struct adapter *Adapter = pDM_Odm->Adapter;
|
||||
|
|
|
|||
|
|
@ -1,30 +1,8 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright(c) 2007 - 2011 Realtek Corporation. */
|
||||
|
||||
/*++
|
||||
|
||||
Module Name:
|
||||
HalPwrSeqCmd.c
|
||||
|
||||
Abstract:
|
||||
Implement HW Power sequence configuration CMD handling routine for Realtek devices.
|
||||
|
||||
Major Change History:
|
||||
When Who What
|
||||
---------- --------------- -------------------------------
|
||||
2011-10-26 Lucas Modify to be compatible with SD4-CE driver.
|
||||
2011-07-07 Roger Create.
|
||||
|
||||
--*/
|
||||
|
||||
#include "../include/HalPwrSeqCmd.h"
|
||||
|
||||
/* Description: */
|
||||
/* This routine deals with the Power Configuration CMDs parsing
|
||||
* for RTL8723/RTL8188E Series IC.
|
||||
* Assumption:
|
||||
* We should follow specific format which was released from HW SD.
|
||||
*/
|
||||
u8 HalPwrSeqCmdParsing(struct adapter *padapter, struct wl_pwr_cfg pwrseqcmd[])
|
||||
{
|
||||
struct wl_pwr_cfg pwrcfgcmd = {0};
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ void dump_chip_info(struct HAL_VERSION chip_vers)
|
|||
|
||||
cnt += sprintf((buf + cnt), "1T1R_");
|
||||
|
||||
cnt += sprintf((buf + cnt), "RomVer(%d)\n", chip_vers.ROMVer);
|
||||
cnt += sprintf((buf + cnt), "RomVer(%d)\n", 0);
|
||||
|
||||
pr_info("%s", buf);
|
||||
}
|
||||
|
|
@ -267,7 +267,7 @@ static void three_out_pipe(struct adapter *adapter, bool wifi_cfg)
|
|||
bool Hal_MappingOutPipe(struct adapter *adapter, u8 numoutpipe)
|
||||
{
|
||||
struct registry_priv *pregistrypriv = &adapter->registrypriv;
|
||||
bool wifi_cfg = (pregistrypriv->wifi_spec) ? true : false;
|
||||
bool wifi_cfg = pregistrypriv->wifi_spec;
|
||||
bool result = true;
|
||||
|
||||
switch (numoutpipe) {
|
||||
|
|
|
|||
|
|
@ -65,13 +65,13 @@ static void odm_RxPhyStatus92CSeries_Parsing(struct odm_dm_struct *dm_odm,
|
|||
|
||||
struct phy_status_rpt *pPhyStaRpt = (struct phy_status_rpt *)pPhyStatus;
|
||||
|
||||
isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M) && (pPktinfo->Rate <= DESC92C_RATE11M)) ? true : false;
|
||||
isCCKrate = pPktinfo->Rate >= DESC92C_RATE1M && pPktinfo->Rate <= DESC92C_RATE11M;
|
||||
|
||||
if (isCCKrate) {
|
||||
u8 cck_agc_rpt;
|
||||
|
||||
/* (1)Hardware does not provide RSSI for CCK */
|
||||
/* (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */
|
||||
/* (2)PWDB, Average PWDB calculated by hardware (for rate adaptive) */
|
||||
|
||||
cck_highpwr = dm_odm->bCckHighPower;
|
||||
|
||||
|
|
@ -170,7 +170,7 @@ static void odm_RxPhyStatus92CSeries_Parsing(struct odm_dm_struct *dm_odm,
|
|||
/* Get Rx snr value in DB */
|
||||
dm_odm->PhyDbgInfo.RxSNRdB[i] = (s32)(pPhyStaRpt->path_rxsnr[i] / 2);
|
||||
}
|
||||
/* (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */
|
||||
/* (2)PWDB, Average PWDB calculated by hardware (for rate adaptive) */
|
||||
rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1) & 0x7f) - 110;
|
||||
|
||||
PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);
|
||||
|
|
@ -234,7 +234,7 @@ static void odm_Process_RSSIForDM(struct odm_dm_struct *dm_odm,
|
|||
if ((!pPktinfo->bPacketMatchBSSID))
|
||||
return;
|
||||
|
||||
isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M) && (pPktinfo->Rate <= DESC92C_RATE11M)) ? true : false;
|
||||
isCCKrate = pPktinfo->Rate >= DESC92C_RATE1M && pPktinfo->Rate <= DESC92C_RATE11M;
|
||||
|
||||
/* Smart Antenna Debug Message------------------ */
|
||||
if ((dm_odm->AntDivType == CG_TRX_HW_ANTDIV) || (dm_odm->AntDivType == CGCS_RX_HW_ANTDIV)) {
|
||||
|
|
|
|||
|
|
@ -199,16 +199,16 @@ void rtl8188e_set_FwMediaStatus_cmd(struct adapter *adapt, __le16 mstatus_rpt)
|
|||
|
||||
static void ConstructBeacon(struct adapter *adapt, u8 *pframe, u32 *pLength)
|
||||
{
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
__le16 *fctrl;
|
||||
u32 rate_len, pktlen;
|
||||
struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
|
||||
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
|
||||
eth_broadcast_addr(pwlanhdr->addr1);
|
||||
|
|
@ -218,8 +218,8 @@ static void ConstructBeacon(struct adapter *adapt, u8 *pframe, u32 *pLength)
|
|||
SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
|
||||
SetFrameSubType(pframe, WIFI_BEACON);
|
||||
|
||||
pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pframe += sizeof(struct ieee80211_hdr_3addr);
|
||||
pktlen = sizeof(struct ieee80211_hdr_3addr);
|
||||
|
||||
/* timestamp will be inserted by hardware */
|
||||
pframe += 8;
|
||||
|
|
@ -281,15 +281,15 @@ _ConstructBeacon:
|
|||
|
||||
static void ConstructPSPoll(struct adapter *adapt, u8 *pframe, u32 *pLength)
|
||||
{
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
__le16 *fctrl;
|
||||
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
/* Frame control. */
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
SetPwrMgt(fctrl);
|
||||
SetFrameSubType(pframe, WIFI_PSPOLL);
|
||||
|
|
@ -314,7 +314,7 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe,
|
|||
u8 bEosp,
|
||||
u8 bForcePowerSave)
|
||||
{
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
__le16 *fctrl;
|
||||
u32 pktlen;
|
||||
struct mlme_priv *pmlmepriv = &adapt->mlmepriv;
|
||||
|
|
@ -322,9 +322,9 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe,
|
|||
struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
if (bForcePowerSave)
|
||||
SetPwrMgt(fctrl);
|
||||
|
|
@ -353,19 +353,19 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe,
|
|||
SetSeqNum(pwlanhdr, 0);
|
||||
|
||||
if (bQoS) {
|
||||
struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;
|
||||
struct ieee80211_qos_hdr *pwlanqoshdr;
|
||||
|
||||
SetFrameSubType(pframe, WIFI_QOS_DATA_NULL);
|
||||
|
||||
pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos *)pframe;
|
||||
SetPriority(&pwlanqoshdr->qc, AC);
|
||||
SetEOSP(&pwlanqoshdr->qc, bEosp);
|
||||
pwlanqoshdr = (struct ieee80211_qos_hdr *)pframe;
|
||||
SetPriority(&pwlanqoshdr->qos_ctrl, AC);
|
||||
SetEOSP(&pwlanqoshdr->qos_ctrl, bEosp);
|
||||
|
||||
pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);
|
||||
pktlen = sizeof(struct ieee80211_qos_hdr);
|
||||
} else {
|
||||
SetFrameSubType(pframe, WIFI_DATA_NULL);
|
||||
|
||||
pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pktlen = sizeof(struct ieee80211_qos_hdr);
|
||||
}
|
||||
|
||||
*pLength = pktlen;
|
||||
|
|
@ -373,7 +373,7 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe,
|
|||
|
||||
static void ConstructProbeRsp(struct adapter *adapt, u8 *pframe, u32 *pLength, u8 *StaAddr, bool bHideSSID)
|
||||
{
|
||||
struct rtw_ieee80211_hdr *pwlanhdr;
|
||||
struct ieee80211_hdr *pwlanhdr;
|
||||
__le16 *fctrl;
|
||||
u8 *mac, *bssid;
|
||||
u32 pktlen;
|
||||
|
|
@ -381,12 +381,12 @@ static void ConstructProbeRsp(struct adapter *adapt, u8 *pframe, u32 *pLength, u
|
|||
struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
|
||||
struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
|
||||
|
||||
pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
|
||||
pwlanhdr = (struct ieee80211_hdr *)pframe;
|
||||
|
||||
mac = myid(&adapt->eeprompriv);
|
||||
bssid = cur_network->MacAddress;
|
||||
|
||||
fctrl = &pwlanhdr->frame_ctl;
|
||||
fctrl = &pwlanhdr->frame_control;
|
||||
*(fctrl) = 0;
|
||||
memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
|
||||
memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
|
||||
|
|
@ -395,7 +395,7 @@ static void ConstructProbeRsp(struct adapter *adapt, u8 *pframe, u32 *pLength, u
|
|||
SetSeqNum(pwlanhdr, 0);
|
||||
SetFrameSubType(fctrl, WIFI_PROBERSP);
|
||||
|
||||
pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
|
||||
pktlen = sizeof(struct ieee80211_hdr_3addr);
|
||||
pframe += pktlen;
|
||||
|
||||
if (cur_network->IELength > MAX_IE_SZ)
|
||||
|
|
@ -557,8 +557,7 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *adapt, u8 mstatus)
|
|||
rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl & (~BIT(6))));
|
||||
haldata->RegFwHwTxQCtrl &= (~BIT(6));
|
||||
|
||||
/* Clear beacon valid check bit. */
|
||||
SetHwReg8188EU(adapt, HW_VAR_BCN_VALID, NULL);
|
||||
clear_beacon_valid_bit(adapt);
|
||||
DLBcnCount = 0;
|
||||
poll = 0;
|
||||
do {
|
||||
|
|
@ -569,7 +568,7 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *adapt, u8 mstatus)
|
|||
yield();
|
||||
/* mdelay(10); */
|
||||
/* check rsvd page download OK. */
|
||||
GetHwReg8188EU(adapt, HW_VAR_BCN_VALID, (u8 *)(&bcn_valid));
|
||||
bcn_valid = get_beacon_valid_bit(adapt);
|
||||
poll++;
|
||||
} while (!bcn_valid && (poll % 10) != 0 && !adapt->bSurpriseRemoved && !adapt->bDriverStopped);
|
||||
} while (!bcn_valid && DLBcnCount <= 100 && !adapt->bSurpriseRemoved && !adapt->bDriverStopped);
|
||||
|
|
@ -597,7 +596,7 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *adapt, u8 mstatus)
|
|||
|
||||
/* Update RSVD page location H2C to Fw. */
|
||||
if (bcn_valid)
|
||||
SetHwReg8188EU(adapt, HW_VAR_BCN_VALID, NULL);
|
||||
clear_beacon_valid_bit(adapt);
|
||||
|
||||
/* Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. */
|
||||
/* Clear CR[8] or beacon packet will not be send to TxBuf anymore. */
|
||||
|
|
|
|||
|
|
@ -33,17 +33,16 @@ static s32 iol_execute(struct adapter *padapter, u8 control)
|
|||
{
|
||||
s32 status = _FAIL;
|
||||
u8 reg_0x88 = 0;
|
||||
u32 start = 0, passing_time = 0;
|
||||
unsigned long timeout;
|
||||
|
||||
control = control & 0x0f;
|
||||
reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0);
|
||||
rtw_write8(padapter, REG_HMEBOX_E0, reg_0x88 | control);
|
||||
|
||||
start = jiffies;
|
||||
timeout = jiffies + msecs_to_jiffies(1000);
|
||||
while ((reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0)) & control &&
|
||||
(passing_time = rtw_get_passing_time_ms(start)) < 1000) {
|
||||
time_before(jiffies, timeout))
|
||||
;
|
||||
}
|
||||
|
||||
reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0);
|
||||
status = (reg_0x88 & control) ? _FAIL : _SUCCESS;
|
||||
|
|
@ -187,8 +186,8 @@ static void efuse_read_phymap_from_txpktbuf(
|
|||
u16 *size /* for efuse content: the max byte to read. will update to byte read */
|
||||
)
|
||||
{
|
||||
unsigned long timeout;
|
||||
u16 dbg_addr = 0;
|
||||
u32 start = 0, passing_time = 0;
|
||||
__le32 lo32 = 0, hi32 = 0;
|
||||
u16 len = 0, count = 0;
|
||||
int i = 0;
|
||||
|
|
@ -207,9 +206,8 @@ static void efuse_read_phymap_from_txpktbuf(
|
|||
rtw_write16(adapter, REG_PKTBUF_DBG_ADDR, dbg_addr + i);
|
||||
|
||||
rtw_write8(adapter, REG_TXPKTBUF_DBG, 0);
|
||||
start = jiffies;
|
||||
while (!rtw_read8(adapter, REG_TXPKTBUF_DBG) &&
|
||||
(passing_time = rtw_get_passing_time_ms(start)) < 1000)
|
||||
timeout = jiffies + msecs_to_jiffies(1000);
|
||||
while (!rtw_read8(adapter, REG_TXPKTBUF_DBG) && time_before(jiffies, timeout))
|
||||
rtw_usleep_os(100);
|
||||
|
||||
/* data from EEPROM needs to be in LE */
|
||||
|
|
@ -505,7 +503,6 @@ void rtl8188e_read_chip_version(struct adapter *padapter)
|
|||
|
||||
ChipVersion.VendorType = ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : CHIP_VENDOR_TSMC);
|
||||
ChipVersion.CUTVersion = (value32 & CHIP_VER_RTL_MASK) >> CHIP_VER_RTL_SHIFT; /* IC version (CUT) */
|
||||
ChipVersion.ROMVer = 0; /* ROM code version. */
|
||||
|
||||
dump_chip_info(ChipVersion);
|
||||
|
||||
|
|
|
|||
|
|
@ -378,10 +378,10 @@ phy_InitBBRFRegisterDefinition(
|
|||
/* Tx AGC Gain Stage (same for all path. Should we remove this?) */
|
||||
pHalData->PHYRegDef.rfTxGainStage = rFPGA0_TxGainStage; /* Tx gain stage */
|
||||
|
||||
/* Tranceiver A~D HSSI Parameter-1 */
|
||||
/* Transceiver A~D HSSI Parameter-1 */
|
||||
pHalData->PHYRegDef.rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; /* wire control parameter1 */
|
||||
|
||||
/* Tranceiver A~D HSSI Parameter-2 */
|
||||
/* Transceiver A~D HSSI Parameter-2 */
|
||||
pHalData->PHYRegDef.rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; /* wire control parameter2 */
|
||||
|
||||
/* RF switch Control */
|
||||
|
|
@ -405,10 +405,10 @@ phy_InitBBRFRegisterDefinition(
|
|||
/* Tx AFE control 2 */
|
||||
pHalData->PHYRegDef.rfTxAFE = rOFDM0_XATxAFE;
|
||||
|
||||
/* Tranceiver LSSI Readback SI mode */
|
||||
/* Transceiver LSSI Readback SI mode */
|
||||
pHalData->PHYRegDef.rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
|
||||
|
||||
/* Tranceiver LSSI Readback PI mode */
|
||||
/* Transceiver LSSI Readback PI mode */
|
||||
pHalData->PHYRegDef.rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -113,12 +113,13 @@ void update_recvframe_phyinfo_88e(struct recv_frame *precvframe, struct phy_stat
|
|||
struct hal_data_8188e *pHalData = &padapter->haldata;
|
||||
struct phy_info *pPHYInfo = &pattrib->phy_info;
|
||||
u8 *wlanhdr = precvframe->rx_data;
|
||||
__le16 fc = *(__le16 *)wlanhdr;
|
||||
struct odm_per_pkt_info pkt_info;
|
||||
u8 *sa = NULL;
|
||||
struct sta_priv *pstapriv;
|
||||
struct sta_info *psta;
|
||||
|
||||
pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) &&
|
||||
pkt_info.bPacketMatchBSSID = ((!ieee80211_is_ctl(fc)) &&
|
||||
!pattrib->icv_err && !pattrib->crc_err &&
|
||||
!memcmp(get_hdr_bssid(wlanhdr),
|
||||
get_bssid(&padapter->mlmepriv), ETH_ALEN));
|
||||
|
|
@ -127,9 +128,7 @@ void update_recvframe_phyinfo_88e(struct recv_frame *precvframe, struct phy_stat
|
|||
(!memcmp(get_da(wlanhdr),
|
||||
myid(&padapter->eeprompriv), ETH_ALEN));
|
||||
|
||||
pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID &&
|
||||
(GetFrameSubType(wlanhdr) == WIFI_BEACON);
|
||||
|
||||
pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && ieee80211_is_beacon(fc);
|
||||
if (pkt_info.bPacketBeacon) {
|
||||
if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE))
|
||||
sa = padapter->mlmepriv.cur_network.network.MacAddress;
|
||||
|
|
|
|||
|
|
@ -347,7 +347,7 @@ static s32 rtw_dump_xframe(struct adapter *adapt, struct xmit_frame *pxmitframe)
|
|||
|
||||
mem_addr += w_sz;
|
||||
|
||||
mem_addr = (u8 *)RND4(((size_t)(mem_addr)));
|
||||
mem_addr = PTR_ALIGN(mem_addr, 4);
|
||||
}
|
||||
|
||||
rtw_free_xmitframe(pxmitpriv, pxmitframe);
|
||||
|
|
@ -437,7 +437,7 @@ bool rtl8188eu_xmitframe_complete(struct adapter *adapt, struct xmit_priv *pxmit
|
|||
pfirstframe = pxmitframe;
|
||||
len = xmitframe_need_length(pfirstframe) + TXDESC_SIZE + (pfirstframe->pkt_offset * PACKET_OFFSET_SZ);
|
||||
pbuf_tail = len;
|
||||
pbuf = _RND8(pbuf_tail);
|
||||
pbuf = round_up(pbuf_tail, 8);
|
||||
|
||||
/* check pkt amount in one bulk */
|
||||
desc_cnt = 0;
|
||||
|
|
@ -488,7 +488,7 @@ bool rtl8188eu_xmitframe_complete(struct adapter *adapt, struct xmit_priv *pxmit
|
|||
|
||||
len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
|
||||
|
||||
if (_RND8(pbuf + len) > MAX_XMITBUF_SZ) {
|
||||
if (pbuf + len > MAX_XMITBUF_SZ) {
|
||||
pxmitframe->agg_num = 1;
|
||||
pxmitframe->pkt_offset = 1;
|
||||
break;
|
||||
|
|
@ -511,7 +511,7 @@ bool rtl8188eu_xmitframe_complete(struct adapter *adapt, struct xmit_priv *pxmit
|
|||
|
||||
/* handle pointer and stop condition */
|
||||
pbuf_tail = pbuf + len;
|
||||
pbuf = _RND8(pbuf_tail);
|
||||
pbuf = round_up(pbuf_tail, 8);
|
||||
|
||||
pfirstframe->agg_num++;
|
||||
if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num)
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ static void _InitQueueReservedPage(struct adapter *Adapter)
|
|||
if (haldata->OutEpQueueSel & TX_SELE_LQ)
|
||||
numLQ = 0x1C;
|
||||
|
||||
/* NOTE: This step shall be proceed before writting REG_RQPN. */
|
||||
/* NOTE: This step shall be proceed before writing REG_RQPN. */
|
||||
if (haldata->OutEpQueueSel & TX_SELE_NQ)
|
||||
numNQ = 0x1C;
|
||||
value8 = (u8)_NPQ(numNQ);
|
||||
|
|
@ -539,10 +539,6 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter)
|
|||
/* Save target channel */
|
||||
haldata->CurrentChannel = 6;/* default set to 6 */
|
||||
|
||||
if (pwrctrlpriv->reg_rfoff) {
|
||||
pwrctrlpriv->rf_pwrstate = rf_off;
|
||||
}
|
||||
|
||||
/* 2010/08/09 MH We need to check if we need to turnon or off RF after detecting */
|
||||
/* HW GPIO pin. Before PHY_RFConfig8192C. */
|
||||
/* 2010/08/26 MH If Efuse does not support sective suspend then disable the function. */
|
||||
|
|
@ -942,17 +938,6 @@ static void hw_var_set_opmode(struct adapter *Adapter, u8 *val)
|
|||
}
|
||||
}
|
||||
|
||||
static void hw_var_set_bssid(struct adapter *Adapter, u8 *val)
|
||||
{
|
||||
u8 idx = 0;
|
||||
u32 reg_bssid;
|
||||
|
||||
reg_bssid = REG_BSSID;
|
||||
|
||||
for (idx = 0; idx < 6; idx++)
|
||||
rtw_write8(Adapter, (reg_bssid + idx), val[idx]);
|
||||
}
|
||||
|
||||
void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &Adapter->haldata;
|
||||
|
|
@ -963,9 +948,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
|||
case HW_VAR_SET_OPMODE:
|
||||
hw_var_set_opmode(Adapter, val);
|
||||
break;
|
||||
case HW_VAR_BSSID:
|
||||
hw_var_set_bssid(Adapter, val);
|
||||
break;
|
||||
case HW_VAR_BASIC_RATE:
|
||||
{
|
||||
u16 BrateCfg = 0;
|
||||
|
|
@ -1024,17 +1006,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
|||
ResumeTxBeacon(Adapter);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_MLME_DISCONNECT:
|
||||
/* Set RCR to not to receive data frame when NO LINK state */
|
||||
/* reject all data frames */
|
||||
rtw_write16(Adapter, REG_RXFLTMAP2, 0x00);
|
||||
|
||||
/* reset TSF */
|
||||
rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
|
||||
|
||||
/* disable update TSF */
|
||||
rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(4));
|
||||
break;
|
||||
case HW_VAR_MLME_SITESURVEY:
|
||||
if (*((u8 *)val)) { /* under sitesurvey */
|
||||
/* config RCR to receive different BSSID & not to receive data frame */
|
||||
|
|
@ -1065,36 +1036,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
|||
rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_BCN);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_MLME_JOIN:
|
||||
{
|
||||
u8 RetryLimit = 0x30;
|
||||
u8 type = *((u8 *)val);
|
||||
struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
|
||||
|
||||
if (type == 0) { /* prepare to join */
|
||||
/* enable to rx data frame.Accept all data frame */
|
||||
rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);
|
||||
|
||||
rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_DATA | RCR_CBSSID_BCN);
|
||||
|
||||
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
|
||||
RetryLimit = 48;
|
||||
else /* Ad-hoc Mode */
|
||||
RetryLimit = 0x7;
|
||||
} else if (type == 1) {
|
||||
/* joinbss_event call back when join res < 0 */
|
||||
rtw_write16(Adapter, REG_RXFLTMAP2, 0x00);
|
||||
} else if (type == 2) {
|
||||
/* sta add event call back */
|
||||
/* enable update TSF */
|
||||
rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(4)));
|
||||
|
||||
if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE))
|
||||
RetryLimit = 0x7;
|
||||
}
|
||||
rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_SLOT_TIME:
|
||||
{
|
||||
u8 u1bAIFS, aSifsTime;
|
||||
|
|
@ -1119,26 +1060,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
|||
}
|
||||
}
|
||||
break;
|
||||
case HW_VAR_RESP_SIFS:
|
||||
/* RESP_SIFS for CCK */
|
||||
rtw_write8(Adapter, REG_R2T_SIFS, val[0]); /* SIFS_T2T_CCK (0x08) */
|
||||
rtw_write8(Adapter, REG_R2T_SIFS + 1, val[1]); /* SIFS_R2T_CCK(0x08) */
|
||||
/* RESP_SIFS for OFDM */
|
||||
rtw_write8(Adapter, REG_T2T_SIFS, val[2]); /* SIFS_T2T_OFDM (0x0a) */
|
||||
rtw_write8(Adapter, REG_T2T_SIFS + 1, val[3]); /* SIFS_R2T_OFDM(0x0a) */
|
||||
break;
|
||||
case HW_VAR_ACK_PREAMBLE:
|
||||
{
|
||||
u8 regTmp;
|
||||
u8 bShortPreamble = *((bool *)val);
|
||||
/* Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) */
|
||||
regTmp = (haldata->nCur40MhzPrimeSC) << 5;
|
||||
if (bShortPreamble)
|
||||
regTmp |= 0x80;
|
||||
|
||||
rtw_write8(Adapter, REG_RRSR + 2, regTmp);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_DM_FLAG:
|
||||
podmpriv->SupportAbility = *((u8 *)val);
|
||||
break;
|
||||
|
|
@ -1148,73 +1069,11 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
|||
else
|
||||
podmpriv->SupportAbility = podmpriv->BK_SupportAbility;
|
||||
break;
|
||||
case HW_VAR_DM_FUNC_SET:
|
||||
if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) {
|
||||
podmpriv->SupportAbility = pdmpriv->InitODMFlag;
|
||||
} else {
|
||||
podmpriv->SupportAbility |= *((u32 *)val);
|
||||
}
|
||||
case HW_VAR_DM_FUNC_RESET:
|
||||
podmpriv->SupportAbility = pdmpriv->InitODMFlag;
|
||||
break;
|
||||
case HW_VAR_DM_FUNC_CLR:
|
||||
podmpriv->SupportAbility &= *((u32 *)val);
|
||||
break;
|
||||
case HW_VAR_AC_PARAM_BE:
|
||||
haldata->AcParam_BE = ((u32 *)(val))[0];
|
||||
rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]);
|
||||
break;
|
||||
case HW_VAR_ACM_CTRL:
|
||||
{
|
||||
u8 acm_ctrl = *((u8 *)val);
|
||||
u8 AcmCtrl = rtw_read8(Adapter, REG_ACMHWCTRL);
|
||||
|
||||
if (acm_ctrl > 1)
|
||||
AcmCtrl = AcmCtrl | 0x1;
|
||||
|
||||
if (acm_ctrl & BIT(3))
|
||||
AcmCtrl |= AcmHw_VoqEn;
|
||||
else
|
||||
AcmCtrl &= (~AcmHw_VoqEn);
|
||||
|
||||
if (acm_ctrl & BIT(2))
|
||||
AcmCtrl |= AcmHw_ViqEn;
|
||||
else
|
||||
AcmCtrl &= (~AcmHw_ViqEn);
|
||||
|
||||
if (acm_ctrl & BIT(1))
|
||||
AcmCtrl |= AcmHw_BeqEn;
|
||||
else
|
||||
AcmCtrl &= (~AcmHw_BeqEn);
|
||||
|
||||
rtw_write8(Adapter, REG_ACMHWCTRL, AcmCtrl);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_AMPDU_MIN_SPACE:
|
||||
{
|
||||
u8 MinSpacingToSet;
|
||||
u8 SecMinSpace;
|
||||
|
||||
MinSpacingToSet = *((u8 *)val);
|
||||
if (MinSpacingToSet <= 7) {
|
||||
switch (Adapter->securitypriv.dot11PrivacyAlgrthm) {
|
||||
case _NO_PRIVACY_:
|
||||
case _AES_:
|
||||
SecMinSpace = 0;
|
||||
break;
|
||||
case _WEP40_:
|
||||
case _WEP104_:
|
||||
case _TKIP_:
|
||||
case _TKIP_WTMIC_:
|
||||
SecMinSpace = 6;
|
||||
break;
|
||||
default:
|
||||
SecMinSpace = 7;
|
||||
break;
|
||||
}
|
||||
if (MinSpacingToSet < SecMinSpace)
|
||||
MinSpacingToSet = SecMinSpace;
|
||||
rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet);
|
||||
}
|
||||
}
|
||||
podmpriv->SupportAbility = 0;
|
||||
break;
|
||||
case HW_VAR_AMPDU_FACTOR:
|
||||
{
|
||||
|
|
@ -1242,221 +1101,15 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
|||
}
|
||||
}
|
||||
break;
|
||||
case HW_VAR_RXDMA_AGG_PG_TH:
|
||||
{
|
||||
u8 threshold = *((u8 *)val);
|
||||
if (threshold == 0)
|
||||
threshold = USB_RXAGG_PAGE_COUNT;
|
||||
rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_H2C_FW_PWRMODE:
|
||||
{
|
||||
u8 psmode = (*(u8 *)val);
|
||||
|
||||
/* Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power */
|
||||
/* saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang. */
|
||||
if (psmode != PS_MODE_ACTIVE)
|
||||
ODM_RF_Saving(podmpriv, true);
|
||||
rtl8188e_set_FwPwrMode_cmd(Adapter, psmode);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_H2C_FW_JOINBSSRPT:
|
||||
{
|
||||
u8 mstatus = (*(u8 *)val);
|
||||
rtl8188e_set_FwJoinBssReport_cmd(Adapter, mstatus);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
|
||||
{
|
||||
u8 p2p_ps_state = (*(u8 *)val);
|
||||
rtl8188e_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_INITIAL_GAIN:
|
||||
{
|
||||
struct rtw_dig *pDigTable = &podmpriv->DM_DigTable;
|
||||
u32 rx_gain = ((u32 *)(val))[0];
|
||||
|
||||
if (rx_gain == 0xff) {/* restore rx gain */
|
||||
ODM_Write_DIG(podmpriv, pDigTable->BackupIGValue);
|
||||
} else {
|
||||
pDigTable->BackupIGValue = pDigTable->CurIGValue;
|
||||
ODM_Write_DIG(podmpriv, rx_gain);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HW_VAR_RPT_TIMER_SETTING:
|
||||
{
|
||||
u16 min_rpt_time = (*(u16 *)val);
|
||||
ODM_RA_Set_TxRPT_Time(podmpriv, min_rpt_time);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_ANTENNA_DIVERSITY_SELECT:
|
||||
{
|
||||
u8 Optimum_antenna = (*(u8 *)val);
|
||||
u8 Ant;
|
||||
/* switch antenna to Optimum_antenna */
|
||||
if (haldata->CurAntenna != Optimum_antenna) {
|
||||
Ant = (Optimum_antenna == 2) ? MAIN_ANT : AUX_ANT;
|
||||
ODM_UpdateRxIdleAnt_88E(&haldata->odmpriv, Ant);
|
||||
|
||||
haldata->CurAntenna = Optimum_antenna;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HW_VAR_FIFO_CLEARN_UP:
|
||||
{
|
||||
struct pwrctrl_priv *pwrpriv = &Adapter->pwrctrlpriv;
|
||||
u8 trycnt = 100;
|
||||
|
||||
/* pause tx */
|
||||
rtw_write8(Adapter, REG_TXPAUSE, 0xff);
|
||||
|
||||
/* keep sn */
|
||||
Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter, REG_NQOS_SEQ);
|
||||
|
||||
if (!pwrpriv->bkeepfwalive) {
|
||||
/* RX DMA stop */
|
||||
rtw_write32(Adapter, REG_RXPKT_NUM, (rtw_read32(Adapter, REG_RXPKT_NUM) | RW_RELEASE_EN));
|
||||
do {
|
||||
if (!(rtw_read32(Adapter, REG_RXPKT_NUM) & RXDMA_IDLE))
|
||||
break;
|
||||
} while (trycnt--);
|
||||
|
||||
/* RQPN Load 0 */
|
||||
rtw_write16(Adapter, REG_RQPN_NPQ, 0x0);
|
||||
rtw_write32(Adapter, REG_RQPN, 0x80000000);
|
||||
mdelay(10);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HW_VAR_TX_RPT_MAX_MACID:
|
||||
{
|
||||
u8 maxMacid = *val;
|
||||
rtw_write8(Adapter, REG_TX_RPT_CTRL + 1, maxMacid + 1);
|
||||
}
|
||||
break;
|
||||
case HW_VAR_H2C_MEDIA_STATUS_RPT:
|
||||
rtl8188e_set_FwMediaStatus_cmd(Adapter, (*(__le16 *)val));
|
||||
break;
|
||||
case HW_VAR_BCN_VALID:
|
||||
/* BCN_VALID, BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2, write 1 to clear, Clear by sw */
|
||||
rtw_write8(Adapter, REG_TDECTRL + 2, rtw_read8(Adapter, REG_TDECTRL + 2) | BIT(0));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void GetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &Adapter->haldata;
|
||||
struct odm_dm_struct *podmpriv = &haldata->odmpriv;
|
||||
|
||||
switch (variable) {
|
||||
case HW_VAR_BCN_VALID:
|
||||
/* BCN_VALID, BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2 */
|
||||
val[0] = (BIT(0) & rtw_read8(Adapter, REG_TDECTRL + 2)) ? true : false;
|
||||
break;
|
||||
case HW_VAR_DM_FLAG:
|
||||
val[0] = podmpriv->SupportAbility;
|
||||
break;
|
||||
case HW_VAR_FWLPS_RF_ON:
|
||||
{
|
||||
/* When we halt NIC, we should check if FW LPS is leave. */
|
||||
if (Adapter->pwrctrlpriv.rf_pwrstate == rf_off) {
|
||||
/* If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, */
|
||||
/* because Fw is unload. */
|
||||
val[0] = true;
|
||||
} else {
|
||||
u32 valRCR;
|
||||
valRCR = rtw_read32(Adapter, REG_RCR);
|
||||
valRCR &= 0x00070000;
|
||||
if (valRCR)
|
||||
val[0] = false;
|
||||
else
|
||||
val[0] = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HW_VAR_CHK_HI_QUEUE_EMPTY:
|
||||
*val = ((rtw_read32(Adapter, REG_HGQ_INFORMATION) & 0x0000ff00) == 0) ? true : false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Query setting of specified variable. */
|
||||
void GetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &Adapter->haldata;
|
||||
|
||||
switch (eVariable) {
|
||||
case HAL_DEF_IS_SUPPORT_ANT_DIV:
|
||||
*((u8 *)pValue) = (haldata->AntDivCfg == 0) ? false : true;
|
||||
break;
|
||||
case HAL_DEF_CURRENT_ANTENNA:
|
||||
*((u8 *)pValue) = haldata->CurAntenna;
|
||||
break;
|
||||
case HAL_DEF_DBG_DM_FUNC:
|
||||
*((u32 *)pValue) = haldata->odmpriv.SupportAbility;
|
||||
break;
|
||||
case HAL_DEF_DBG_DUMP_RXPKT:
|
||||
*((u8 *)pValue) = haldata->bDumpRxPkt;
|
||||
break;
|
||||
case HAL_DEF_DBG_DUMP_TXPKT:
|
||||
*((u8 *)pValue) = haldata->bDumpTxPkt;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Change default setting of specified variable. */
|
||||
void SetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue)
|
||||
{
|
||||
struct hal_data_8188e *haldata = &Adapter->haldata;
|
||||
|
||||
switch (eVariable) {
|
||||
case HAL_DEF_DBG_DM_FUNC:
|
||||
{
|
||||
u8 dm_func = *((u8 *)pValue);
|
||||
struct odm_dm_struct *podmpriv = &haldata->odmpriv;
|
||||
|
||||
if (dm_func == 0) { /* disable all dynamic func */
|
||||
podmpriv->SupportAbility = DYNAMIC_FUNC_DISABLE;
|
||||
} else if (dm_func == 1) {/* disable DIG */
|
||||
podmpriv->SupportAbility &= (~DYNAMIC_BB_DIG);
|
||||
} else if (dm_func == 2) {/* disable High power */
|
||||
podmpriv->SupportAbility &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
|
||||
} else if (dm_func == 3) {/* disable tx power tracking */
|
||||
podmpriv->SupportAbility &= (~DYNAMIC_RF_CALIBRATION);
|
||||
} else if (dm_func == 5) {/* disable antenna diversity */
|
||||
podmpriv->SupportAbility &= (~DYNAMIC_BB_ANT_DIV);
|
||||
} else if (dm_func == 6) {/* turn on all dynamic func */
|
||||
if (!(podmpriv->SupportAbility & DYNAMIC_BB_DIG)) {
|
||||
struct rtw_dig *pDigTable = &podmpriv->DM_DigTable;
|
||||
pDigTable->CurIGValue = rtw_read8(Adapter, 0xc50);
|
||||
}
|
||||
podmpriv->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HAL_DEF_DBG_DUMP_RXPKT:
|
||||
haldata->bDumpRxPkt = *((u8 *)pValue);
|
||||
break;
|
||||
case HAL_DEF_DBG_DUMP_TXPKT:
|
||||
haldata->bDumpTxPkt = *((u8 *)pValue);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateHalRAMask8188EUsb(struct adapter *adapt, u32 mac_id, u8 rssi_level)
|
||||
{
|
||||
u8 init_rate = 0;
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ static int usb_read(struct intf_hdl *intf, u16 value, void *data, u8 size)
|
|||
int status;
|
||||
u8 io_buf[4];
|
||||
|
||||
if (adapt->bSurpriseRemoved || adapt->pwrctrlpriv.pnp_bstop_trx)
|
||||
if (adapt->bSurpriseRemoved)
|
||||
return -EPERM;
|
||||
|
||||
status = usb_control_msg_recv(udev, 0, REALTEK_USB_VENQT_CMD_REQ,
|
||||
|
|
@ -59,7 +59,7 @@ static int usb_write(struct intf_hdl *intf, u16 value, void *data, u8 size)
|
|||
int status;
|
||||
u8 io_buf[VENDOR_CMD_MAX_DATA_LEN];
|
||||
|
||||
if (adapt->bSurpriseRemoved || adapt->pwrctrlpriv.pnp_bstop_trx)
|
||||
if (adapt->bSurpriseRemoved)
|
||||
return -EPERM;
|
||||
|
||||
memcpy(io_buf, data, size);
|
||||
|
|
@ -260,7 +260,6 @@ static int recvbuf2recvframe(struct adapter *adapt, struct sk_buff *pskb)
|
|||
|
||||
pkt_copy = netdev_alloc_skb(adapt->pnetdev, alloc_sz);
|
||||
if (pkt_copy) {
|
||||
pkt_copy->dev = adapt->pnetdev;
|
||||
precvframe->pkt = pkt_copy;
|
||||
precvframe->rx_head = pkt_copy->data;
|
||||
precvframe->rx_end = pkt_copy->data + alloc_sz;
|
||||
|
|
@ -288,7 +287,7 @@ static int recvbuf2recvframe(struct adapter *adapt, struct sk_buff *pskb)
|
|||
|
||||
recvframe_put(precvframe, skb_len);
|
||||
|
||||
pkt_offset = (u16)_RND128(pkt_offset);
|
||||
pkt_offset = (u16)round_up(pkt_offset, 128);
|
||||
|
||||
if (pattrib->pkt_rpt_type == NORMAL_RX) { /* Normal rx packet */
|
||||
if (pattrib->physt)
|
||||
|
|
@ -415,8 +414,7 @@ u32 rtw_read_port(struct adapter *adapter, u8 *rmem)
|
|||
size_t alignment = 0;
|
||||
u32 ret = _SUCCESS;
|
||||
|
||||
if (adapter->bDriverStopped || adapter->bSurpriseRemoved ||
|
||||
adapter->pwrctrlpriv.pnp_bstop_trx)
|
||||
if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
|
||||
return _FAIL;
|
||||
|
||||
if (!precvbuf)
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ struct HAL_VERSION {
|
|||
enum HAL_CHIP_TYPE ChipType;
|
||||
enum HAL_CUT_VERSION CUTVersion;
|
||||
enum HAL_VENDOR VendorType;
|
||||
u8 ROMVer;
|
||||
};
|
||||
|
||||
/* Get element */
|
||||
|
|
@ -34,10 +33,10 @@ struct HAL_VERSION {
|
|||
|
||||
/* HAL_CHIP_TYPE_E */
|
||||
#define IS_NORMAL_CHIP(version) \
|
||||
((GET_CVID_CHIP_TYPE(version) == NORMAL_CHIP) ? true : false)
|
||||
(GET_CVID_CHIP_TYPE(version) == NORMAL_CHIP)
|
||||
|
||||
/* HAL_VENDOR_E */
|
||||
#define IS_CHIP_VENDOR_TSMC(version) \
|
||||
((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC) ? true : false)
|
||||
(GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -4,9 +4,6 @@
|
|||
#ifndef __BASIC_TYPES_H__
|
||||
#define __BASIC_TYPES_H__
|
||||
|
||||
#define SUCCESS 0
|
||||
#define FAIL (-1)
|
||||
|
||||
#include <linux/types.h>
|
||||
#define NDIS_OID uint
|
||||
|
||||
|
|
@ -14,9 +11,6 @@ typedef void (*proc_t)(void *);
|
|||
|
||||
#define FIELD_OFFSET(s, field) ((ssize_t)&((s *)(0))->field)
|
||||
|
||||
#define MEM_ALIGNMENT_OFFSET (sizeof(size_t))
|
||||
#define MEM_ALIGNMENT_PADDING (sizeof(size_t) - 1)
|
||||
|
||||
/* port from fw */
|
||||
/* TODO: Macros Below are Sync from SD7-Driver. It is necessary
|
||||
* to check correctness */
|
||||
|
|
@ -31,86 +25,21 @@ typedef void (*proc_t)(void *);
|
|||
/* Convert little data endian to host ordering */
|
||||
#define EF1BYTE(_val) \
|
||||
((u8)(_val))
|
||||
#define EF2BYTE(_val) \
|
||||
(le16_to_cpu(_val))
|
||||
#define EF4BYTE(_val) \
|
||||
(le32_to_cpu(_val))
|
||||
|
||||
/* Read data from memory */
|
||||
#define READEF1BYTE(_ptr) \
|
||||
EF1BYTE(*((u8 *)(_ptr)))
|
||||
/* Read le16 data from memory and convert to host ordering */
|
||||
#define READEF2BYTE(_ptr) \
|
||||
EF2BYTE(*(_ptr))
|
||||
#define READEF4BYTE(_ptr) \
|
||||
EF4BYTE(*(_ptr))
|
||||
|
||||
/* Write data to memory */
|
||||
#define WRITEEF1BYTE(_ptr, _val) \
|
||||
do { \
|
||||
(*((u8 *)(_ptr))) = EF1BYTE(_val) \
|
||||
} while (0)
|
||||
/* Write le data to memory in host ordering */
|
||||
#define WRITEEF2BYTE(_ptr, _val) \
|
||||
do { \
|
||||
(*((u16 *)(_ptr))) = EF2BYTE(_val) \
|
||||
} while (0)
|
||||
|
||||
#define WRITEEF4BYTE(_ptr, _val) \
|
||||
do { \
|
||||
(*((u32 *)(_ptr))) = EF2BYTE(_val) \
|
||||
} while (0)
|
||||
|
||||
/* Create a bit mask
|
||||
* Examples:
|
||||
* BIT_LEN_MASK_32(0) => 0x00000000
|
||||
* BIT_LEN_MASK_32(1) => 0x00000001
|
||||
* BIT_LEN_MASK_32(2) => 0x00000003
|
||||
* BIT_LEN_MASK_32(32) => 0xFFFFFFFF
|
||||
*/
|
||||
#define BIT_LEN_MASK_32(__bitlen) \
|
||||
(0xFFFFFFFF >> (32 - (__bitlen)))
|
||||
#define BIT_LEN_MASK_16(__bitlen) \
|
||||
(0xFFFF >> (16 - (__bitlen)))
|
||||
/* Create a bit mask */
|
||||
#define BIT_LEN_MASK_8(__bitlen) \
|
||||
(0xFF >> (8 - (__bitlen)))
|
||||
|
||||
/* Create an offset bit mask
|
||||
* Examples:
|
||||
* BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
|
||||
* BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
|
||||
*/
|
||||
#define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
|
||||
(BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
|
||||
#define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \
|
||||
(BIT_LEN_MASK_16(__bitlen) << (__bitoffset))
|
||||
#define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \
|
||||
(BIT_LEN_MASK_8(__bitlen) << (__bitoffset))
|
||||
|
||||
/*Description:
|
||||
* Return 4-byte value in host byte ordering from
|
||||
* 4-byte pointer in little-endian system.
|
||||
*/
|
||||
#define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \
|
||||
(EF4BYTE(*((__le32 *)(__pstart))))
|
||||
#define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \
|
||||
(EF2BYTE(*((__le16 *)(__pstart))))
|
||||
#define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \
|
||||
(EF1BYTE(*((u8 *)(__pstart))))
|
||||
|
||||
/*Description:
|
||||
Translate subfield (continuous bits in little-endian) of 4-byte
|
||||
value to host byte ordering.*/
|
||||
#define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
|
||||
( \
|
||||
(LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset)) & \
|
||||
BIT_LEN_MASK_32(__bitlen) \
|
||||
)
|
||||
#define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
|
||||
( \
|
||||
(LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
|
||||
BIT_LEN_MASK_16(__bitlen) \
|
||||
)
|
||||
#define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
|
||||
( \
|
||||
(LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
#include "rtw_eeprom.h"
|
||||
#include "sta_info.h"
|
||||
#include "rtw_mlme.h"
|
||||
#include "rtw_debug.h"
|
||||
#include "rtw_rf.h"
|
||||
#include "rtw_event.h"
|
||||
#include "rtw_led.h"
|
||||
|
|
@ -35,6 +34,7 @@
|
|||
#include "rtw_ap.h"
|
||||
#include "rtw_br_ext.h"
|
||||
#include "rtl8188e_hal.h"
|
||||
#include "rtw_fw.h"
|
||||
|
||||
#define DRIVERVERSION "v4.1.4_6773.20130222"
|
||||
|
||||
|
|
@ -116,11 +116,6 @@ struct registry_priv {
|
|||
|
||||
#define MAX_CONTINUAL_URB_ERR 4
|
||||
|
||||
struct rt_firmware {
|
||||
u8 *data;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
struct dvobj_priv {
|
||||
struct adapter *if1;
|
||||
|
||||
|
|
|
|||
|
|
@ -10,44 +10,16 @@
|
|||
|
||||
enum hw_variables {
|
||||
HW_VAR_SET_OPMODE,
|
||||
HW_VAR_BSSID,
|
||||
HW_VAR_BASIC_RATE,
|
||||
HW_VAR_CORRECT_TSF,
|
||||
HW_VAR_MLME_DISCONNECT,
|
||||
HW_VAR_MLME_SITESURVEY,
|
||||
HW_VAR_MLME_JOIN,
|
||||
HW_VAR_SLOT_TIME,
|
||||
HW_VAR_RESP_SIFS,
|
||||
HW_VAR_ACK_PREAMBLE,
|
||||
HW_VAR_BCN_VALID,
|
||||
HW_VAR_DM_FLAG,
|
||||
HW_VAR_DM_FUNC_OP,
|
||||
HW_VAR_DM_FUNC_SET,
|
||||
HW_VAR_DM_FUNC_RESET,
|
||||
HW_VAR_DM_FUNC_CLR,
|
||||
HW_VAR_AC_PARAM_BE,
|
||||
HW_VAR_ACM_CTRL,
|
||||
HW_VAR_AMPDU_MIN_SPACE,
|
||||
HW_VAR_AMPDU_FACTOR,
|
||||
HW_VAR_RXDMA_AGG_PG_TH,
|
||||
HW_VAR_H2C_FW_PWRMODE,
|
||||
HW_VAR_H2C_FW_JOINBSSRPT,
|
||||
HW_VAR_FWLPS_RF_ON,
|
||||
HW_VAR_H2C_FW_P2P_PS_OFFLOAD,
|
||||
HW_VAR_INITIAL_GAIN,
|
||||
HW_VAR_ANTENNA_DIVERSITY_SELECT,
|
||||
HW_VAR_FIFO_CLEARN_UP,
|
||||
HW_VAR_RPT_TIMER_SETTING,
|
||||
HW_VAR_TX_RPT_MAX_MACID,
|
||||
HW_VAR_H2C_MEDIA_STATUS_RPT,
|
||||
HW_VAR_CHK_HI_QUEUE_EMPTY,
|
||||
};
|
||||
|
||||
enum hal_def_variable {
|
||||
HAL_DEF_IS_SUPPORT_ANT_DIV,
|
||||
HAL_DEF_CURRENT_ANTENNA,
|
||||
HAL_DEF_DBG_DUMP_RXPKT,/* for dbg */
|
||||
HAL_DEF_DBG_DM_FUNC,/* for dbg */
|
||||
HAL_DEF_DBG_DUMP_TXPKT,
|
||||
};
|
||||
|
||||
typedef s32 (*c2h_id_filter)(u8 id);
|
||||
|
|
@ -70,13 +42,9 @@ void UpdateHalRAMask8188EUsb(struct adapter *adapt, u32 mac_id, u8 rssi_level);
|
|||
int rtl8188e_IOL_exec_cmds_sync(struct adapter *adapter,
|
||||
struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt);
|
||||
|
||||
void SetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue);
|
||||
void GetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue);
|
||||
|
||||
unsigned int rtl8188eu_inirp_init(struct adapter *Adapter);
|
||||
|
||||
void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val);
|
||||
void GetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val);
|
||||
|
||||
uint rtw_hal_init(struct adapter *padapter);
|
||||
uint rtw_hal_deinit(struct adapter *padapter);
|
||||
|
|
|
|||
|
|
@ -123,24 +123,6 @@ enum NETWORK_TYPE {
|
|||
WIRELESS_11BG_24N = (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N),
|
||||
};
|
||||
|
||||
#define SUPPORTED_24G_NETTYPE_MSK \
|
||||
(WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N)
|
||||
|
||||
#define IsSupported24G(NetType) \
|
||||
((NetType) & SUPPORTED_24G_NETTYPE_MSK ? true : false)
|
||||
|
||||
#define IsEnableHWCCK(NetType) \
|
||||
IsSupported24G(NetType)
|
||||
|
||||
#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType)
|
||||
|
||||
#define IsSupportedTxCCK(NetType) \
|
||||
((NetType) & (WIRELESS_11B) ? true : false)
|
||||
#define IsSupportedTxOFDM(NetType) \
|
||||
((NetType) & (WIRELESS_11G) ? true : false)
|
||||
#define IsSupportedTxMCS(NetType) \
|
||||
((NetType) & (WIRELESS_11_24N) ? true : false)
|
||||
|
||||
struct ieee_param {
|
||||
u32 cmd;
|
||||
u8 sta_addr[ETH_ALEN];
|
||||
|
|
@ -196,35 +178,6 @@ struct ieee_param {
|
|||
/* this is stolen from ipw2200 driver */
|
||||
#define IEEE_IBSS_MAC_HASH_SIZE 31
|
||||
|
||||
struct rtw_ieee80211_hdr {
|
||||
__le16 frame_ctl;
|
||||
__le16 duration_id;
|
||||
u8 addr1[ETH_ALEN];
|
||||
u8 addr2[ETH_ALEN];
|
||||
u8 addr3[ETH_ALEN];
|
||||
u16 seq_ctl;
|
||||
u8 addr4[ETH_ALEN];
|
||||
} __packed;
|
||||
|
||||
struct rtw_ieee80211_hdr_3addr {
|
||||
__le16 frame_ctl;
|
||||
__le16 duration_id;
|
||||
u8 addr1[ETH_ALEN];
|
||||
u8 addr2[ETH_ALEN];
|
||||
u8 addr3[ETH_ALEN];
|
||||
u16 seq_ctl;
|
||||
} __packed;
|
||||
|
||||
struct rtw_ieee80211_hdr_3addr_qos {
|
||||
__le16 frame_ctl;
|
||||
__le16 duration_id;
|
||||
u8 addr1[ETH_ALEN];
|
||||
u8 addr2[ETH_ALEN];
|
||||
u8 addr3[ETH_ALEN];
|
||||
u16 seq_ctl;
|
||||
u16 qc;
|
||||
} __packed;
|
||||
|
||||
#define IEEE80211_3ADDR_LEN 24
|
||||
#define IEEE80211_4ADDR_LEN 30
|
||||
#define IEEE80211_FCS_LEN 4
|
||||
|
|
@ -636,24 +589,8 @@ static inline int is_broadcast_mac_addr(const u8 *addr)
|
|||
|
||||
#define MAXTID 16
|
||||
|
||||
#define IEEE_A (1<<0)
|
||||
#define IEEE_B (1<<1)
|
||||
#define IEEE_G (1<<2)
|
||||
#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G)
|
||||
|
||||
/* Action category code */
|
||||
enum rtw_ieee80211_category {
|
||||
RTW_WLAN_CATEGORY_SPECTRUM_MGMT = 0,
|
||||
RTW_WLAN_CATEGORY_QOS = 1,
|
||||
RTW_WLAN_CATEGORY_DLS = 2,
|
||||
RTW_WLAN_CATEGORY_BACK = 3,
|
||||
RTW_WLAN_CATEGORY_PUBLIC = 4, /* IEEE 802.11 public action frames */
|
||||
RTW_WLAN_CATEGORY_RADIO_MEASUREMENT = 5,
|
||||
RTW_WLAN_CATEGORY_FT = 6,
|
||||
RTW_WLAN_CATEGORY_HT = 7,
|
||||
RTW_WLAN_CATEGORY_SA_QUERY = 8,
|
||||
RTW_WLAN_CATEGORY_TDLS = 12,
|
||||
RTW_WLAN_CATEGORY_WMM = 17,
|
||||
RTW_WLAN_CATEGORY_P2P = 0x7f,/* P2P action frames */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -98,22 +98,6 @@ struct odm_per_pkt_info {
|
|||
bool bPacketBeacon;
|
||||
};
|
||||
|
||||
enum odm_ability {
|
||||
/* BB Team */
|
||||
ODM_DIG = 0x00000001,
|
||||
ODM_HIGH_POWER = 0x00000002,
|
||||
ODM_CCK_CCA_TH = 0x00000004,
|
||||
ODM_FA_STATISTICS = 0x00000008,
|
||||
ODM_RAMASK = 0x00000010,
|
||||
ODM_RSSI_MONITOR = 0x00000020,
|
||||
ODM_SW_ANTDIV = 0x00000040,
|
||||
ODM_HW_ANTDIV = 0x00000080,
|
||||
ODM_BB_PWRSV = 0x00000100,
|
||||
ODM_2TPATHDIV = 0x00000200,
|
||||
ODM_1TPATHDIV = 0x00000400,
|
||||
ODM_PSD2AFH = 0x00000800
|
||||
};
|
||||
|
||||
/* 2011/10/20 MH Define Common info enum for all team. */
|
||||
|
||||
enum odm_common_info_def {
|
||||
|
|
@ -137,19 +121,6 @@ enum odm_ability_def {
|
|||
|
||||
# define ODM_ITRF_USB 0x2
|
||||
|
||||
/* ODM_CMNINFO_OP_MODE */
|
||||
enum odm_operation_mode {
|
||||
ODM_NO_LINK = BIT(0),
|
||||
ODM_LINK = BIT(1),
|
||||
ODM_SCAN = BIT(2),
|
||||
ODM_POWERSAVE = BIT(3),
|
||||
ODM_AP_MODE = BIT(4),
|
||||
ODM_CLIENT_MODE = BIT(5),
|
||||
ODM_AD_HOC = BIT(6),
|
||||
ODM_WIFI_DIRECT = BIT(7),
|
||||
ODM_WIFI_DISPLAY = BIT(8),
|
||||
};
|
||||
|
||||
/* ODM_CMNINFO_WM_MODE */
|
||||
enum odm_wireless_mode {
|
||||
ODM_WM_UNKNOW = 0x0,
|
||||
|
|
|
|||
|
|
@ -77,10 +77,6 @@ void *rtw_malloc2d(int h, int w, int size);
|
|||
spin_lock_init(&((q)->lock)); \
|
||||
} while (0)
|
||||
|
||||
u32 rtw_systime_to_ms(u32 systime);
|
||||
u32 rtw_ms_to_systime(u32 ms);
|
||||
s32 rtw_get_passing_time_ms(u32 start);
|
||||
|
||||
void rtw_usleep_os(int us);
|
||||
|
||||
static inline unsigned char _cancel_timer_ex(struct timer_list *ptimer)
|
||||
|
|
@ -94,49 +90,6 @@ static inline void flush_signals_thread(void)
|
|||
flush_signals(current);
|
||||
}
|
||||
|
||||
#define _RND(sz, r) ((((sz)+((r)-1))/(r))*(r))
|
||||
#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2)
|
||||
|
||||
static inline u32 _RND4(u32 sz)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2;
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline u32 _RND8(u32 sz)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3;
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline u32 _RND128(u32 sz)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7;
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline u32 _RND256(u32 sz)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8;
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline u32 _RND512(u32 sz)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9;
|
||||
return val;
|
||||
}
|
||||
|
||||
struct rtw_netdev_priv_indicator {
|
||||
void *priv;
|
||||
u32 sizeof_priv;
|
||||
|
|
|
|||
|
|
@ -160,9 +160,6 @@ struct hal_data_8188e {
|
|||
u8 AntDivCfg;
|
||||
u8 TRxAntDivType;
|
||||
|
||||
u8 bDumpRxPkt;/* for debug */
|
||||
u8 bDumpTxPkt;/* for debug */
|
||||
|
||||
u8 OutEpQueueSel;
|
||||
u8 OutEpNumber;
|
||||
|
||||
|
|
|
|||
|
|
@ -998,13 +998,9 @@ Current IOREG MAP
|
|||
#define STOP_BCNQ BIT(6)
|
||||
|
||||
/* 2 ACMHWCTRL */
|
||||
#define AcmHw_HwEn BIT(0)
|
||||
#define AcmHw_BeqEn BIT(1)
|
||||
#define AcmHw_ViqEn BIT(2)
|
||||
#define AcmHw_VoqEn BIT(3)
|
||||
#define AcmHw_BeqStatus BIT(4)
|
||||
#define AcmHw_ViqStatus BIT(5)
|
||||
#define AcmHw_VoqStatus BIT(6)
|
||||
#define ACMHW_BEQEN BIT(1)
|
||||
#define ACMHW_VIQEN BIT(2)
|
||||
#define ACMHW_VOQEN BIT(3)
|
||||
|
||||
/* 0x0600h ~ 0x07FFh WMAC Configuration */
|
||||
/* 2APSD_CTRL */
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue