mirror of
https://github.com/LuckfoxTECH/luckfox-pico.git
synced 2026-01-19 09:52:31 +01:00
project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp: Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem. sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately. sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades. sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for fastboot. Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
This commit is contained in:
@@ -1462,6 +1462,13 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
||||
if (!cqr->lpm)
|
||||
cqr->lpm = dasd_path_get_opm(device);
|
||||
}
|
||||
/*
|
||||
* remember the amount of formatted tracks to prevent double format on
|
||||
* ESE devices
|
||||
*/
|
||||
if (cqr->block)
|
||||
cqr->trkcount = atomic_read(&cqr->block->trkcount);
|
||||
|
||||
if (cqr->cpmode == 1) {
|
||||
rc = ccw_device_tm_start(device->cdev, cqr->cpaddr,
|
||||
(long) cqr, cqr->lpm);
|
||||
@@ -1680,6 +1687,7 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
||||
unsigned long now;
|
||||
int nrf_suppressed = 0;
|
||||
int fp_suppressed = 0;
|
||||
struct request *req;
|
||||
u8 *sense = NULL;
|
||||
int expires;
|
||||
|
||||
@@ -1780,7 +1788,12 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
||||
}
|
||||
|
||||
if (dasd_ese_needs_format(cqr->block, irb)) {
|
||||
if (rq_data_dir((struct request *)cqr->callback_data) == READ) {
|
||||
req = dasd_get_callback_data(cqr);
|
||||
if (!req) {
|
||||
cqr->status = DASD_CQR_ERROR;
|
||||
return;
|
||||
}
|
||||
if (rq_data_dir(req) == READ) {
|
||||
device->discipline->ese_read(cqr, irb);
|
||||
cqr->status = DASD_CQR_SUCCESS;
|
||||
cqr->stopclk = now;
|
||||
@@ -2799,8 +2812,7 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr)
|
||||
* complete a request partially.
|
||||
*/
|
||||
if (proc_bytes) {
|
||||
blk_update_request(req, BLK_STS_OK,
|
||||
blk_rq_bytes(req) - proc_bytes);
|
||||
blk_update_request(req, BLK_STS_OK, proc_bytes);
|
||||
blk_mq_requeue_request(req, true);
|
||||
} else if (likely(!blk_should_fake_timeout(req->q))) {
|
||||
blk_mq_complete_request(req);
|
||||
|
||||
@@ -675,12 +675,12 @@ int dasd_alias_remove_device(struct dasd_device *device)
|
||||
struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
|
||||
{
|
||||
struct dasd_eckd_private *alias_priv, *private = base_device->private;
|
||||
struct alias_pav_group *group = private->pavgroup;
|
||||
struct alias_lcu *lcu = private->lcu;
|
||||
struct dasd_device *alias_device;
|
||||
struct alias_pav_group *group;
|
||||
unsigned long flags;
|
||||
|
||||
if (!group || !lcu)
|
||||
if (!lcu)
|
||||
return NULL;
|
||||
if (lcu->pav == NO_PAV ||
|
||||
lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING))
|
||||
@@ -697,6 +697,11 @@ struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device)
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&lcu->lock, flags);
|
||||
group = private->pavgroup;
|
||||
if (!group) {
|
||||
spin_unlock_irqrestore(&lcu->lock, flags);
|
||||
return NULL;
|
||||
}
|
||||
alias_device = group->next;
|
||||
if (!alias_device) {
|
||||
if (list_empty(&group->aliaslist)) {
|
||||
|
||||
@@ -3026,13 +3026,24 @@ static int dasd_eckd_format_device(struct dasd_device *base,
|
||||
}
|
||||
|
||||
static bool test_and_set_format_track(struct dasd_format_entry *to_format,
|
||||
struct dasd_block *block)
|
||||
struct dasd_ccw_req *cqr)
|
||||
{
|
||||
struct dasd_block *block = cqr->block;
|
||||
struct dasd_format_entry *format;
|
||||
unsigned long flags;
|
||||
bool rc = false;
|
||||
|
||||
spin_lock_irqsave(&block->format_lock, flags);
|
||||
if (cqr->trkcount != atomic_read(&block->trkcount)) {
|
||||
/*
|
||||
* The number of formatted tracks has changed after request
|
||||
* start and we can not tell if the current track was involved.
|
||||
* To avoid data corruption treat it as if the current track is
|
||||
* involved
|
||||
*/
|
||||
rc = true;
|
||||
goto out;
|
||||
}
|
||||
list_for_each_entry(format, &block->format_list, list) {
|
||||
if (format->track == to_format->track) {
|
||||
rc = true;
|
||||
@@ -3052,6 +3063,7 @@ static void clear_format_track(struct dasd_format_entry *format,
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&block->format_lock, flags);
|
||||
atomic_inc(&block->trkcount);
|
||||
list_del_init(&format->list);
|
||||
spin_unlock_irqrestore(&block->format_lock, flags);
|
||||
}
|
||||
@@ -3088,7 +3100,7 @@ dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr,
|
||||
sector_t curr_trk;
|
||||
int rc;
|
||||
|
||||
req = cqr->callback_data;
|
||||
req = dasd_get_callback_data(cqr);
|
||||
block = cqr->block;
|
||||
base = block->base;
|
||||
private = base->private;
|
||||
@@ -3113,8 +3125,11 @@ dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr,
|
||||
}
|
||||
format->track = curr_trk;
|
||||
/* test if track is already in formatting by another thread */
|
||||
if (test_and_set_format_track(format, block))
|
||||
if (test_and_set_format_track(format, cqr)) {
|
||||
/* this is no real error so do not count down retries */
|
||||
cqr->retries++;
|
||||
return ERR_PTR(-EEXIST);
|
||||
}
|
||||
|
||||
fdata.start_unit = curr_trk;
|
||||
fdata.stop_unit = curr_trk;
|
||||
@@ -3213,12 +3228,11 @@ static int dasd_eckd_ese_read(struct dasd_ccw_req *cqr, struct irb *irb)
|
||||
cqr->proc_bytes = blk_count * blksize;
|
||||
return 0;
|
||||
}
|
||||
if (dst && !skip_block) {
|
||||
dst += off;
|
||||
if (dst && !skip_block)
|
||||
memset(dst, 0, blksize);
|
||||
} else {
|
||||
else
|
||||
skip_block--;
|
||||
}
|
||||
dst += blksize;
|
||||
blk_count++;
|
||||
}
|
||||
}
|
||||
@@ -4613,7 +4627,6 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
|
||||
struct dasd_device *basedev;
|
||||
struct req_iterator iter;
|
||||
struct dasd_ccw_req *cqr;
|
||||
unsigned int first_offs;
|
||||
unsigned int trkcount;
|
||||
unsigned long *idaws;
|
||||
unsigned int size;
|
||||
@@ -4647,7 +4660,6 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
|
||||
last_trk = (blk_rq_pos(req) + blk_rq_sectors(req) - 1) /
|
||||
DASD_RAW_SECTORS_PER_TRACK;
|
||||
trkcount = last_trk - first_trk + 1;
|
||||
first_offs = 0;
|
||||
|
||||
if (rq_data_dir(req) == READ)
|
||||
cmd = DASD_ECKD_CCW_READ_TRACK;
|
||||
@@ -4691,13 +4703,13 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
|
||||
|
||||
if (use_prefix) {
|
||||
prefix_LRE(ccw++, data, first_trk, last_trk, cmd, basedev,
|
||||
startdev, 1, first_offs + 1, trkcount, 0, 0);
|
||||
startdev, 1, 0, trkcount, 0, 0);
|
||||
} else {
|
||||
define_extent(ccw++, data, first_trk, last_trk, cmd, basedev, 0);
|
||||
ccw[-1].flags |= CCW_FLAG_CC;
|
||||
|
||||
data += sizeof(struct DE_eckd_data);
|
||||
locate_record_ext(ccw++, data, first_trk, first_offs + 1,
|
||||
locate_record_ext(ccw++, data, first_trk, 0,
|
||||
trkcount, cmd, basedev, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -188,6 +188,7 @@ struct dasd_ccw_req {
|
||||
void (*callback)(struct dasd_ccw_req *, void *data);
|
||||
void *callback_data;
|
||||
unsigned int proc_bytes; /* bytes for partial completion */
|
||||
unsigned int trkcount; /* count formatted tracks */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -575,6 +576,7 @@ struct dasd_block {
|
||||
|
||||
struct list_head format_list;
|
||||
spinlock_t format_lock;
|
||||
atomic_t trkcount;
|
||||
};
|
||||
|
||||
struct dasd_attention_data {
|
||||
@@ -723,6 +725,18 @@ dasd_check_blocksize(int bsize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* return the callback data of the original request in case there are
|
||||
* ERP requests build on top of it
|
||||
*/
|
||||
static inline void *dasd_get_callback_data(struct dasd_ccw_req *cqr)
|
||||
{
|
||||
while (cqr->refers)
|
||||
cqr = cqr->refers;
|
||||
|
||||
return cqr->callback_data;
|
||||
}
|
||||
|
||||
/* externals in dasd.c */
|
||||
#define DASD_PROFILE_OFF 0
|
||||
#define DASD_PROFILE_ON 1
|
||||
|
||||
@@ -56,7 +56,7 @@ static inline void
|
||||
kbd_put_queue(struct tty_port *port, int ch)
|
||||
{
|
||||
tty_insert_flip_char(port, ch, 0);
|
||||
tty_schedule_flip(port);
|
||||
tty_flip_buffer_push(port);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -64,5 +64,5 @@ kbd_puts_queue(struct tty_port *port, char *cp)
|
||||
{
|
||||
while (*cp)
|
||||
tty_insert_flip_char(port, *cp++, 0);
|
||||
tty_schedule_flip(port);
|
||||
tty_flip_buffer_push(port);
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ static struct dentry *zcore_reipl_file;
|
||||
static struct dentry *zcore_hsa_file;
|
||||
static struct ipl_parameter_block *zcore_ipl_block;
|
||||
|
||||
static DEFINE_MUTEX(hsa_buf_mutex);
|
||||
static char hsa_buf[PAGE_SIZE] __aligned(PAGE_SIZE);
|
||||
|
||||
/*
|
||||
@@ -64,19 +65,24 @@ int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count)
|
||||
if (!hsa_available)
|
||||
return -ENODATA;
|
||||
|
||||
mutex_lock(&hsa_buf_mutex);
|
||||
while (count) {
|
||||
if (sclp_sdias_copy(hsa_buf, src / PAGE_SIZE + 2, 1)) {
|
||||
TRACE("sclp_sdias_copy() failed\n");
|
||||
mutex_unlock(&hsa_buf_mutex);
|
||||
return -EIO;
|
||||
}
|
||||
offset = src % PAGE_SIZE;
|
||||
bytes = min(PAGE_SIZE - offset, count);
|
||||
if (copy_to_user(dest, hsa_buf + offset, bytes))
|
||||
if (copy_to_user(dest, hsa_buf + offset, bytes)) {
|
||||
mutex_unlock(&hsa_buf_mutex);
|
||||
return -EFAULT;
|
||||
}
|
||||
src += bytes;
|
||||
dest += bytes;
|
||||
count -= bytes;
|
||||
}
|
||||
mutex_unlock(&hsa_buf_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -94,9 +100,11 @@ int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count)
|
||||
if (!hsa_available)
|
||||
return -ENODATA;
|
||||
|
||||
mutex_lock(&hsa_buf_mutex);
|
||||
while (count) {
|
||||
if (sclp_sdias_copy(hsa_buf, src / PAGE_SIZE + 2, 1)) {
|
||||
TRACE("sclp_sdias_copy() failed\n");
|
||||
mutex_unlock(&hsa_buf_mutex);
|
||||
return -EIO;
|
||||
}
|
||||
offset = src % PAGE_SIZE;
|
||||
@@ -106,6 +114,7 @@ int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count)
|
||||
dest += bytes;
|
||||
count -= bytes;
|
||||
}
|
||||
mutex_unlock(&hsa_buf_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -288,19 +288,11 @@ static int vfio_ccw_sch_event(struct subchannel *sch, int process)
|
||||
if (work_pending(&sch->todo_work))
|
||||
goto out_unlock;
|
||||
|
||||
if (cio_update_schib(sch)) {
|
||||
vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_NOT_OPER);
|
||||
rc = 0;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
private = dev_get_drvdata(&sch->dev);
|
||||
if (private->state == VFIO_CCW_STATE_NOT_OPER) {
|
||||
private->state = private->mdev ? VFIO_CCW_STATE_IDLE :
|
||||
VFIO_CCW_STATE_STANDBY;
|
||||
}
|
||||
rc = 0;
|
||||
|
||||
if (cio_update_schib(sch))
|
||||
vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_NOT_OPER);
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(sch->lock, flags);
|
||||
|
||||
|
||||
@@ -626,8 +626,6 @@ static void mpc_rcvd_sweep_resp(struct mpcg_info *mpcginfo)
|
||||
ctcm_clear_busy_do(dev);
|
||||
}
|
||||
|
||||
kfree(mpcginfo);
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
@@ -1206,10 +1204,10 @@ static void ctcmpc_unpack_skb(struct channel *ch, struct sk_buff *pskb)
|
||||
CTCM_FUNTAIL, dev->name);
|
||||
priv->stats.rx_dropped++;
|
||||
/* mpcginfo only used for non-data transfers */
|
||||
kfree(mpcginfo);
|
||||
if (do_debug_data)
|
||||
ctcmpc_dump_skb(pskb, -8);
|
||||
}
|
||||
kfree(mpcginfo);
|
||||
}
|
||||
done:
|
||||
|
||||
@@ -1991,7 +1989,6 @@ static void mpc_action_rcvd_xid0(fsm_instance *fsm, int event, void *arg)
|
||||
}
|
||||
break;
|
||||
}
|
||||
kfree(mpcginfo);
|
||||
|
||||
CTCM_PR_DEBUG("ctcmpc:%s() %s xid2:%i xid7:%i xidt_p2:%i \n",
|
||||
__func__, ch->id, grp->outstanding_xid2,
|
||||
@@ -2052,7 +2049,6 @@ static void mpc_action_rcvd_xid7(fsm_instance *fsm, int event, void *arg)
|
||||
mpc_validate_xid(mpcginfo);
|
||||
break;
|
||||
}
|
||||
kfree(mpcginfo);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,11 +39,12 @@ static ssize_t ctcm_buffer_write(struct device *dev,
|
||||
struct ctcm_priv *priv = dev_get_drvdata(dev);
|
||||
int rc;
|
||||
|
||||
ndev = priv->channel[CTCM_READ]->netdev;
|
||||
if (!(priv && priv->channel[CTCM_READ] && ndev)) {
|
||||
if (!(priv && priv->channel[CTCM_READ] &&
|
||||
priv->channel[CTCM_READ]->netdev)) {
|
||||
CTCM_DBF_TEXT(SETUP, CTC_DBF_ERROR, "bfnondev");
|
||||
return -ENODEV;
|
||||
}
|
||||
ndev = priv->channel[CTCM_READ]->netdev;
|
||||
|
||||
rc = kstrtouint(buf, 0, &bs1);
|
||||
if (rc)
|
||||
|
||||
@@ -1735,10 +1735,11 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd)
|
||||
lcs_schedule_recovery(card);
|
||||
break;
|
||||
case LCS_CMD_STOPLAN:
|
||||
pr_warn("Stoplan for %s initiated by LGW\n",
|
||||
card->dev->name);
|
||||
if (card->dev)
|
||||
if (card->dev) {
|
||||
pr_warn("Stoplan for %s initiated by LGW\n",
|
||||
card->dev->name);
|
||||
netif_carrier_off(card->dev);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
LCS_DBF_TEXT(5, trace, "noLGWcmd");
|
||||
|
||||
@@ -145,27 +145,33 @@ void zfcp_fc_enqueue_event(struct zfcp_adapter *adapter,
|
||||
|
||||
static int zfcp_fc_wka_port_get(struct zfcp_fc_wka_port *wka_port)
|
||||
{
|
||||
int ret = -EIO;
|
||||
|
||||
if (mutex_lock_interruptible(&wka_port->mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (wka_port->status == ZFCP_FC_WKA_PORT_OFFLINE ||
|
||||
wka_port->status == ZFCP_FC_WKA_PORT_CLOSING) {
|
||||
wka_port->status = ZFCP_FC_WKA_PORT_OPENING;
|
||||
if (zfcp_fsf_open_wka_port(wka_port))
|
||||
if (zfcp_fsf_open_wka_port(wka_port)) {
|
||||
/* could not even send request, nothing to wait for */
|
||||
wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&wka_port->mutex);
|
||||
|
||||
wait_event(wka_port->completion_wq,
|
||||
wait_event(wka_port->opened,
|
||||
wka_port->status == ZFCP_FC_WKA_PORT_ONLINE ||
|
||||
wka_port->status == ZFCP_FC_WKA_PORT_OFFLINE);
|
||||
|
||||
if (wka_port->status == ZFCP_FC_WKA_PORT_ONLINE) {
|
||||
atomic_inc(&wka_port->refcount);
|
||||
return 0;
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
return -EIO;
|
||||
out:
|
||||
mutex_unlock(&wka_port->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void zfcp_fc_wka_port_offline(struct work_struct *work)
|
||||
@@ -181,9 +187,12 @@ static void zfcp_fc_wka_port_offline(struct work_struct *work)
|
||||
|
||||
wka_port->status = ZFCP_FC_WKA_PORT_CLOSING;
|
||||
if (zfcp_fsf_close_wka_port(wka_port)) {
|
||||
/* could not even send request, nothing to wait for */
|
||||
wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
|
||||
wake_up(&wka_port->completion_wq);
|
||||
goto out;
|
||||
}
|
||||
wait_event(wka_port->closed,
|
||||
wka_port->status == ZFCP_FC_WKA_PORT_OFFLINE);
|
||||
out:
|
||||
mutex_unlock(&wka_port->mutex);
|
||||
}
|
||||
@@ -193,13 +202,15 @@ static void zfcp_fc_wka_port_put(struct zfcp_fc_wka_port *wka_port)
|
||||
if (atomic_dec_return(&wka_port->refcount) != 0)
|
||||
return;
|
||||
/* wait 10 milliseconds, other reqs might pop in */
|
||||
schedule_delayed_work(&wka_port->work, HZ / 100);
|
||||
queue_delayed_work(wka_port->adapter->work_queue, &wka_port->work,
|
||||
msecs_to_jiffies(10));
|
||||
}
|
||||
|
||||
static void zfcp_fc_wka_port_init(struct zfcp_fc_wka_port *wka_port, u32 d_id,
|
||||
struct zfcp_adapter *adapter)
|
||||
{
|
||||
init_waitqueue_head(&wka_port->completion_wq);
|
||||
init_waitqueue_head(&wka_port->opened);
|
||||
init_waitqueue_head(&wka_port->closed);
|
||||
|
||||
wka_port->adapter = adapter;
|
||||
wka_port->d_id = d_id;
|
||||
|
||||
@@ -185,7 +185,8 @@ enum zfcp_fc_wka_status {
|
||||
/**
|
||||
* struct zfcp_fc_wka_port - representation of well-known-address (WKA) FC port
|
||||
* @adapter: Pointer to adapter structure this WKA port belongs to
|
||||
* @completion_wq: Wait for completion of open/close command
|
||||
* @opened: Wait for completion of open command
|
||||
* @closed: Wait for completion of close command
|
||||
* @status: Current status of WKA port
|
||||
* @refcount: Reference count to keep port open as long as it is in use
|
||||
* @d_id: FC destination id or well-known-address
|
||||
@@ -195,7 +196,8 @@ enum zfcp_fc_wka_status {
|
||||
*/
|
||||
struct zfcp_fc_wka_port {
|
||||
struct zfcp_adapter *adapter;
|
||||
wait_queue_head_t completion_wq;
|
||||
wait_queue_head_t opened;
|
||||
wait_queue_head_t closed;
|
||||
enum zfcp_fc_wka_status status;
|
||||
atomic_t refcount;
|
||||
u32 d_id;
|
||||
|
||||
@@ -866,7 +866,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
|
||||
const bool is_srb = zfcp_fsf_req_is_status_read_buffer(req);
|
||||
struct zfcp_adapter *adapter = req->adapter;
|
||||
struct zfcp_qdio *qdio = adapter->qdio;
|
||||
int req_id = req->req_id;
|
||||
unsigned long req_id = req->req_id;
|
||||
|
||||
zfcp_reqlist_add(adapter->req_list, req);
|
||||
|
||||
@@ -1889,7 +1889,7 @@ static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req)
|
||||
wka_port->status = ZFCP_FC_WKA_PORT_ONLINE;
|
||||
}
|
||||
out:
|
||||
wake_up(&wka_port->completion_wq);
|
||||
wake_up(&wka_port->opened);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1948,7 +1948,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
|
||||
}
|
||||
|
||||
wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
|
||||
wake_up(&wka_port->completion_wq);
|
||||
wake_up(&wka_port->closed);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user