mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: (30 commits)
[S390] wire up sys_perf_counter_open
[S390] wire up sys_rt_tgsigqueueinfo
[S390] ftrace: add system call tracer support
[S390] ftrace: add function graph tracer support
[S390] ftrace: add function trace mcount test support
[S390] ftrace: add dynamic ftrace support
[S390] kprobes: use probe_kernel_write
[S390] maccess: arch specific probe_kernel_write() implementation
[S390] maccess: add weak attribute to probe_kernel_write
[S390] profile_tick called twice
[S390] dasd: forward internal errors to dasd_sleep_on caller
[S390] dasd: sync after async probe
[S390] dasd: check_characteristics cleanup
[S390] dasd: no High Performance FICON in 31-bit mode
[S390] dcssblk: revert devt conversion
[S390] qdio: fix access beyond ARRAY_SIZE of irq_ptr->{in,out}put_qs
[S390] vmalloc: add vmalloc kernel parameter support
[S390] uaccess: use might_fault() instead of might_sleep()
[S390] 3270: lock dependency fixes
[S390] 3270: do not register with tty_register_device
...
This commit is contained in:
commit
d645727bdc
57 changed files with 1322 additions and 338 deletions
|
|
@ -851,8 +851,10 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
|||
|
||||
/* Check the cqr */
|
||||
rc = dasd_check_cqr(cqr);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
cqr->intrc = rc;
|
||||
return rc;
|
||||
}
|
||||
device = (struct dasd_device *) cqr->startdev;
|
||||
if (cqr->retries < 0) {
|
||||
/* internal error 14 - start_IO run out of retries */
|
||||
|
|
@ -915,6 +917,7 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)
|
|||
BUG();
|
||||
break;
|
||||
}
|
||||
cqr->intrc = rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -1454,8 +1457,12 @@ int dasd_sleep_on(struct dasd_ccw_req *cqr)
|
|||
dasd_add_request_tail(cqr);
|
||||
wait_event(generic_waitq, _wait_for_wakeup(cqr));
|
||||
|
||||
/* Request status is either done or failed. */
|
||||
rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO;
|
||||
if (cqr->status == DASD_CQR_DONE)
|
||||
rc = 0;
|
||||
else if (cqr->intrc)
|
||||
rc = cqr->intrc;
|
||||
else
|
||||
rc = -EIO;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -1477,8 +1484,15 @@ int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr)
|
|||
dasd_cancel_req(cqr);
|
||||
/* wait (non-interruptible) for final status */
|
||||
wait_event(generic_waitq, _wait_for_wakeup(cqr));
|
||||
cqr->intrc = rc;
|
||||
}
|
||||
rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO;
|
||||
|
||||
if (cqr->status == DASD_CQR_DONE)
|
||||
rc = 0;
|
||||
else if (cqr->intrc)
|
||||
rc = cqr->intrc;
|
||||
else
|
||||
rc = -EIO;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -1523,8 +1537,12 @@ int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr)
|
|||
|
||||
wait_event(generic_waitq, _wait_for_wakeup(cqr));
|
||||
|
||||
/* Request status is either done or failed. */
|
||||
rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO;
|
||||
if (cqr->status == DASD_CQR_DONE)
|
||||
rc = 0;
|
||||
else if (cqr->intrc)
|
||||
rc = cqr->intrc;
|
||||
else
|
||||
rc = -EIO;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -2427,12 +2445,12 @@ static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device,
|
|||
|
||||
|
||||
int dasd_generic_read_dev_chars(struct dasd_device *device, char *magic,
|
||||
void **rdc_buffer, int rdc_buffer_size)
|
||||
void *rdc_buffer, int rdc_buffer_size)
|
||||
{
|
||||
int ret;
|
||||
struct dasd_ccw_req *cqr;
|
||||
|
||||
cqr = dasd_generic_build_rdc(device, *rdc_buffer, rdc_buffer_size,
|
||||
cqr = dasd_generic_build_rdc(device, rdc_buffer, rdc_buffer_size,
|
||||
magic);
|
||||
if (IS_ERR(cqr))
|
||||
return PTR_ERR(cqr);
|
||||
|
|
|
|||
|
|
@ -202,6 +202,7 @@ dasd_start_diag(struct dasd_ccw_req * cqr)
|
|||
rc = -EIO;
|
||||
break;
|
||||
}
|
||||
cqr->intrc = rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1097,20 +1097,20 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
|
|||
{
|
||||
struct dasd_eckd_private *private;
|
||||
struct dasd_block *block;
|
||||
void *rdc_data;
|
||||
int is_known, rc;
|
||||
|
||||
private = (struct dasd_eckd_private *) device->private;
|
||||
if (private == NULL) {
|
||||
private = kzalloc(sizeof(struct dasd_eckd_private),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (private == NULL) {
|
||||
if (!private) {
|
||||
private = kzalloc(sizeof(*private), GFP_KERNEL | GFP_DMA);
|
||||
if (!private) {
|
||||
dev_warn(&device->cdev->dev,
|
||||
"Allocating memory for private DASD data "
|
||||
"failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
device->private = (void *) private;
|
||||
} else {
|
||||
memset(private, 0, sizeof(*private));
|
||||
}
|
||||
/* Invalidate status of initial analysis. */
|
||||
private->init_cqr_status = -1;
|
||||
|
|
@ -1161,9 +1161,8 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
|
|||
goto out_err3;
|
||||
|
||||
/* Read Device Characteristics */
|
||||
rdc_data = (void *) &(private->rdc_data);
|
||||
memset(rdc_data, 0, sizeof(rdc_data));
|
||||
rc = dasd_generic_read_dev_chars(device, "ECKD", &rdc_data, 64);
|
||||
rc = dasd_generic_read_dev_chars(device, "ECKD", &private->rdc_data,
|
||||
64);
|
||||
if (rc) {
|
||||
DBF_EVENT(DBF_WARNING,
|
||||
"Read device characteristics failed, rc=%d for "
|
||||
|
|
@ -1183,7 +1182,7 @@ dasd_eckd_check_characteristics(struct dasd_device *device)
|
|||
private->rdc_data.dev_model,
|
||||
private->rdc_data.cu_type,
|
||||
private->rdc_data.cu_model.model,
|
||||
private->real_cyl,
|
||||
private->real_cyl,
|
||||
private->rdc_data.trk_per_cyl,
|
||||
private->rdc_data.sec_per_trk);
|
||||
return 0;
|
||||
|
|
@ -2336,9 +2335,10 @@ static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev,
|
|||
{
|
||||
int tpm, cmdrtd, cmdwtd;
|
||||
int use_prefix;
|
||||
|
||||
struct dasd_eckd_private *private;
|
||||
#if defined(CONFIG_64BIT)
|
||||
int fcx_in_css, fcx_in_gneq, fcx_in_features;
|
||||
#endif
|
||||
struct dasd_eckd_private *private;
|
||||
struct dasd_device *basedev;
|
||||
sector_t first_rec, last_rec;
|
||||
sector_t first_trk, last_trk;
|
||||
|
|
@ -2361,11 +2361,15 @@ static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev,
|
|||
last_offs = sector_div(last_trk, blk_per_trk);
|
||||
cdlspecial = (private->uses_cdl && first_rec < 2*blk_per_trk);
|
||||
|
||||
/* is transport mode supported ? */
|
||||
/* is transport mode supported? */
|
||||
#if defined(CONFIG_64BIT)
|
||||
fcx_in_css = css_general_characteristics.fcx;
|
||||
fcx_in_gneq = private->gneq->reserved2[7] & 0x04;
|
||||
fcx_in_features = private->features.feature[40] & 0x80;
|
||||
tpm = fcx_in_css && fcx_in_gneq && fcx_in_features;
|
||||
#else
|
||||
tpm = 0;
|
||||
#endif
|
||||
|
||||
/* is read track data and write track data in command mode supported? */
|
||||
cmdrtd = private->features.feature[9] & 0x20;
|
||||
|
|
@ -3013,8 +3017,9 @@ static void dasd_eckd_dump_sense_ccw(struct dasd_device *device,
|
|||
" I/O status report for device %s:\n",
|
||||
dev_name(&device->cdev->dev));
|
||||
len += sprintf(page + len, KERN_ERR PRINTK_HEADER
|
||||
" in req: %p CS: 0x%02X DS: 0x%02X\n", req,
|
||||
scsw_cstat(&irb->scsw), scsw_dstat(&irb->scsw));
|
||||
" in req: %p CS: 0x%02X DS: 0x%02X CC: 0x%02X RC: %d\n",
|
||||
req, scsw_cstat(&irb->scsw), scsw_dstat(&irb->scsw),
|
||||
scsw_cc(&irb->scsw), req->intrc);
|
||||
len += sprintf(page + len, KERN_ERR PRINTK_HEADER
|
||||
" device %s: Failing CCW: %p\n",
|
||||
dev_name(&device->cdev->dev),
|
||||
|
|
@ -3115,9 +3120,10 @@ static void dasd_eckd_dump_sense_tcw(struct dasd_device *device,
|
|||
" I/O status report for device %s:\n",
|
||||
dev_name(&device->cdev->dev));
|
||||
len += sprintf(page + len, KERN_ERR PRINTK_HEADER
|
||||
" in req: %p CS: 0x%02X DS: 0x%02X "
|
||||
" in req: %p CS: 0x%02X DS: 0x%02X CC: 0x%02X RC: %d "
|
||||
"fcxs: 0x%02X schxs: 0x%02X\n", req,
|
||||
scsw_cstat(&irb->scsw), scsw_dstat(&irb->scsw),
|
||||
scsw_cc(&irb->scsw), req->intrc,
|
||||
irb->scsw.tm.fcxs, irb->scsw.tm.schxs);
|
||||
len += sprintf(page + len, KERN_ERR PRINTK_HEADER
|
||||
" device %s: Failing TCW: %p\n",
|
||||
|
|
@ -3273,8 +3279,14 @@ static struct dasd_discipline dasd_eckd_discipline = {
|
|||
static int __init
|
||||
dasd_eckd_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ASCEBC(dasd_eckd_discipline.ebcname, 4);
|
||||
return ccw_driver_register(&dasd_eckd_driver);
|
||||
ret = ccw_driver_register(&dasd_eckd_driver);
|
||||
if (!ret)
|
||||
wait_for_device_probe();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
|
|
|
|||
|
|
@ -122,20 +122,20 @@ dasd_fba_check_characteristics(struct dasd_device *device)
|
|||
struct dasd_block *block;
|
||||
struct dasd_fba_private *private;
|
||||
struct ccw_device *cdev = device->cdev;
|
||||
void *rdc_data;
|
||||
int rc;
|
||||
|
||||
private = (struct dasd_fba_private *) device->private;
|
||||
if (private == NULL) {
|
||||
private = kzalloc(sizeof(struct dasd_fba_private),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (private == NULL) {
|
||||
if (!private) {
|
||||
private = kzalloc(sizeof(*private), GFP_KERNEL | GFP_DMA);
|
||||
if (!private) {
|
||||
dev_warn(&device->cdev->dev,
|
||||
"Allocating memory for private DASD "
|
||||
"data failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
device->private = (void *) private;
|
||||
} else {
|
||||
memset(private, 0, sizeof(*private));
|
||||
}
|
||||
block = dasd_alloc_block();
|
||||
if (IS_ERR(block)) {
|
||||
|
|
@ -150,8 +150,8 @@ dasd_fba_check_characteristics(struct dasd_device *device)
|
|||
block->base = device;
|
||||
|
||||
/* Read Device Characteristics */
|
||||
rdc_data = (void *) &(private->rdc_data);
|
||||
rc = dasd_generic_read_dev_chars(device, "FBA ", &rdc_data, 32);
|
||||
rc = dasd_generic_read_dev_chars(device, "FBA ", &private->rdc_data,
|
||||
32);
|
||||
if (rc) {
|
||||
DBF_EVENT(DBF_WARNING, "Read device characteristics returned "
|
||||
"error %d for device: %s",
|
||||
|
|
@ -604,8 +604,14 @@ static struct dasd_discipline dasd_fba_discipline = {
|
|||
static int __init
|
||||
dasd_fba_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ASCEBC(dasd_fba_discipline.ebcname, 4);
|
||||
return ccw_driver_register(&dasd_fba_driver);
|
||||
ret = ccw_driver_register(&dasd_fba_driver);
|
||||
if (!ret)
|
||||
wait_for_device_probe();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
|
|
|
|||
|
|
@ -173,6 +173,7 @@ struct dasd_ccw_req {
|
|||
void *data; /* pointer to data area */
|
||||
|
||||
/* these are important for recovering erroneous requests */
|
||||
int intrc; /* internal error, e.g. from start_IO */
|
||||
struct irb irb; /* device status in case of an error */
|
||||
struct dasd_ccw_req *refers; /* ERP-chain queueing. */
|
||||
void *function; /* originating ERP action */
|
||||
|
|
@ -578,7 +579,7 @@ int dasd_generic_set_offline (struct ccw_device *cdev);
|
|||
int dasd_generic_notify(struct ccw_device *, int);
|
||||
void dasd_generic_handle_state_change(struct dasd_device *);
|
||||
|
||||
int dasd_generic_read_dev_chars(struct dasd_device *, char *, void **, int);
|
||||
int dasd_generic_read_dev_chars(struct dasd_device *, char *, void *, int);
|
||||
char *dasd_get_sense(struct irb *);
|
||||
|
||||
/* externals in dasd_devmap.c */
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ dcssblk_assign_free_minor(struct dcssblk_dev_info *dev_info)
|
|||
found = 0;
|
||||
// test if minor available
|
||||
list_for_each_entry(entry, &dcssblk_devices, lh)
|
||||
if (minor == MINOR(disk_devt(entry->gd)))
|
||||
if (minor == entry->gd->first_minor)
|
||||
found++;
|
||||
if (!found) break; // got unused minor
|
||||
}
|
||||
|
|
@ -625,7 +625,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
|
|||
if (rc)
|
||||
goto release_gd;
|
||||
sprintf(dev_info->gd->disk_name, "dcssblk%d",
|
||||
MINOR(disk_devt(dev_info->gd)));
|
||||
dev_info->gd->first_minor);
|
||||
list_add_tail(&dev_info->lh, &dcssblk_devices);
|
||||
|
||||
if (!try_module_get(THIS_MODULE)) {
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ static struct con3270 *condev;
|
|||
#define CON_UPDATE_ERASE 1 /* Use EWRITEA instead of WRITE. */
|
||||
#define CON_UPDATE_LIST 2 /* Update lines in tty3270->update. */
|
||||
#define CON_UPDATE_STATUS 4 /* Update status line. */
|
||||
#define CON_UPDATE_ALL 7
|
||||
#define CON_UPDATE_ALL 8 /* Recreate screen. */
|
||||
|
||||
static void con3270_update(struct con3270 *);
|
||||
|
||||
|
|
@ -73,18 +73,10 @@ static void con3270_update(struct con3270 *);
|
|||
*/
|
||||
static void con3270_set_timer(struct con3270 *cp, int expires)
|
||||
{
|
||||
if (expires == 0) {
|
||||
if (timer_pending(&cp->timer))
|
||||
del_timer(&cp->timer);
|
||||
return;
|
||||
}
|
||||
if (timer_pending(&cp->timer) &&
|
||||
mod_timer(&cp->timer, jiffies + expires))
|
||||
return;
|
||||
cp->timer.function = (void (*)(unsigned long)) con3270_update;
|
||||
cp->timer.data = (unsigned long) cp;
|
||||
cp->timer.expires = jiffies + expires;
|
||||
add_timer(&cp->timer);
|
||||
if (expires == 0)
|
||||
del_timer(&cp->timer);
|
||||
else
|
||||
mod_timer(&cp->timer, jiffies + expires);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -225,6 +217,12 @@ con3270_update(struct con3270 *cp)
|
|||
|
||||
spin_lock_irqsave(&cp->view.lock, flags);
|
||||
updated = 0;
|
||||
if (cp->update_flags & CON_UPDATE_ALL) {
|
||||
con3270_rebuild_update(cp);
|
||||
con3270_update_status(cp);
|
||||
cp->update_flags = CON_UPDATE_ERASE | CON_UPDATE_LIST |
|
||||
CON_UPDATE_STATUS;
|
||||
}
|
||||
if (cp->update_flags & CON_UPDATE_ERASE) {
|
||||
/* Use erase write alternate to initialize display. */
|
||||
raw3270_request_set_cmd(wrq, TC_EWRITEA);
|
||||
|
|
@ -302,7 +300,6 @@ con3270_read_tasklet(struct raw3270_request *rrq)
|
|||
deactivate = 1;
|
||||
break;
|
||||
case 0x6d: /* clear: start from scratch. */
|
||||
con3270_rebuild_update(cp);
|
||||
cp->update_flags = CON_UPDATE_ALL;
|
||||
con3270_set_timer(cp, 1);
|
||||
break;
|
||||
|
|
@ -382,30 +379,21 @@ con3270_issue_read(struct con3270 *cp)
|
|||
static int
|
||||
con3270_activate(struct raw3270_view *view)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct con3270 *cp;
|
||||
|
||||
cp = (struct con3270 *) view;
|
||||
spin_lock_irqsave(&cp->view.lock, flags);
|
||||
cp->nr_up = 0;
|
||||
con3270_rebuild_update(cp);
|
||||
con3270_update_status(cp);
|
||||
cp->update_flags = CON_UPDATE_ALL;
|
||||
con3270_set_timer(cp, 1);
|
||||
spin_unlock_irqrestore(&cp->view.lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
con3270_deactivate(struct raw3270_view *view)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct con3270 *cp;
|
||||
|
||||
cp = (struct con3270 *) view;
|
||||
spin_lock_irqsave(&cp->view.lock, flags);
|
||||
del_timer(&cp->timer);
|
||||
spin_unlock_irqrestore(&cp->view.lock, flags);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -504,6 +492,7 @@ con3270_write(struct console *co, const char *str, unsigned int count)
|
|||
con3270_cline_end(cp);
|
||||
}
|
||||
/* Setup timer to output current console buffer after 1/10 second */
|
||||
cp->nr_up = 0;
|
||||
if (cp->view.dev && !timer_pending(&cp->timer))
|
||||
con3270_set_timer(cp, HZ/10);
|
||||
spin_unlock_irqrestore(&cp->view.lock,flags);
|
||||
|
|
@ -624,7 +613,8 @@ con3270_init(void)
|
|||
|
||||
INIT_LIST_HEAD(&condev->lines);
|
||||
INIT_LIST_HEAD(&condev->update);
|
||||
init_timer(&condev->timer);
|
||||
setup_timer(&condev->timer, (void (*)(unsigned long)) con3270_update,
|
||||
(unsigned long) condev);
|
||||
tasklet_init(&condev->readlet,
|
||||
(void (*)(unsigned long)) con3270_read_tasklet,
|
||||
(unsigned long) condev->read);
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ struct tty3270 {
|
|||
#define TTY_UPDATE_LIST 2 /* Update lines in tty3270->update. */
|
||||
#define TTY_UPDATE_INPUT 4 /* Update input line. */
|
||||
#define TTY_UPDATE_STATUS 8 /* Update status line. */
|
||||
#define TTY_UPDATE_ALL 15
|
||||
#define TTY_UPDATE_ALL 16 /* Recreate screen. */
|
||||
|
||||
static void tty3270_update(struct tty3270 *);
|
||||
|
||||
|
|
@ -121,19 +121,10 @@ static void tty3270_update(struct tty3270 *);
|
|||
*/
|
||||
static void tty3270_set_timer(struct tty3270 *tp, int expires)
|
||||
{
|
||||
if (expires == 0) {
|
||||
if (timer_pending(&tp->timer) && del_timer(&tp->timer))
|
||||
raw3270_put_view(&tp->view);
|
||||
return;
|
||||
}
|
||||
if (timer_pending(&tp->timer) &&
|
||||
mod_timer(&tp->timer, jiffies + expires))
|
||||
return;
|
||||
raw3270_get_view(&tp->view);
|
||||
tp->timer.function = (void (*)(unsigned long)) tty3270_update;
|
||||
tp->timer.data = (unsigned long) tp;
|
||||
tp->timer.expires = jiffies + expires;
|
||||
add_timer(&tp->timer);
|
||||
if (expires == 0)
|
||||
del_timer(&tp->timer);
|
||||
else
|
||||
mod_timer(&tp->timer, jiffies + expires);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -337,7 +328,6 @@ tty3270_write_callback(struct raw3270_request *rq, void *data)
|
|||
tp = (struct tty3270 *) rq->view;
|
||||
if (rq->rc != 0) {
|
||||
/* Write wasn't successfull. Refresh all. */
|
||||
tty3270_rebuild_update(tp);
|
||||
tp->update_flags = TTY_UPDATE_ALL;
|
||||
tty3270_set_timer(tp, 1);
|
||||
}
|
||||
|
|
@ -366,6 +356,12 @@ tty3270_update(struct tty3270 *tp)
|
|||
|
||||
spin_lock(&tp->view.lock);
|
||||
updated = 0;
|
||||
if (tp->update_flags & TTY_UPDATE_ALL) {
|
||||
tty3270_rebuild_update(tp);
|
||||
tty3270_update_status(tp);
|
||||
tp->update_flags = TTY_UPDATE_ERASE | TTY_UPDATE_LIST |
|
||||
TTY_UPDATE_INPUT | TTY_UPDATE_STATUS;
|
||||
}
|
||||
if (tp->update_flags & TTY_UPDATE_ERASE) {
|
||||
/* Use erase write alternate to erase display. */
|
||||
raw3270_request_set_cmd(wrq, TC_EWRITEA);
|
||||
|
|
@ -425,7 +421,6 @@ tty3270_update(struct tty3270 *tp)
|
|||
xchg(&tp->write, wrq);
|
||||
}
|
||||
spin_unlock(&tp->view.lock);
|
||||
raw3270_put_view(&tp->view);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -570,7 +565,6 @@ tty3270_read_tasklet(struct raw3270_request *rrq)
|
|||
tty3270_set_timer(tp, 1);
|
||||
} else if (tp->input->string[0] == 0x6d) {
|
||||
/* Display has been cleared. Redraw. */
|
||||
tty3270_rebuild_update(tp);
|
||||
tp->update_flags = TTY_UPDATE_ALL;
|
||||
tty3270_set_timer(tp, 1);
|
||||
}
|
||||
|
|
@ -641,22 +635,20 @@ static int
|
|||
tty3270_activate(struct raw3270_view *view)
|
||||
{
|
||||
struct tty3270 *tp;
|
||||
unsigned long flags;
|
||||
|
||||
tp = (struct tty3270 *) view;
|
||||
spin_lock_irqsave(&tp->view.lock, flags);
|
||||
tp->nr_up = 0;
|
||||
tty3270_rebuild_update(tp);
|
||||
tty3270_update_status(tp);
|
||||
tp->update_flags = TTY_UPDATE_ALL;
|
||||
tty3270_set_timer(tp, 1);
|
||||
spin_unlock_irqrestore(&tp->view.lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
tty3270_deactivate(struct raw3270_view *view)
|
||||
{
|
||||
struct tty3270 *tp;
|
||||
|
||||
tp = (struct tty3270 *) view;
|
||||
del_timer(&tp->timer);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -743,6 +735,7 @@ tty3270_free_view(struct tty3270 *tp)
|
|||
{
|
||||
int pages;
|
||||
|
||||
del_timer_sync(&tp->timer);
|
||||
kbd_free(tp->kbd);
|
||||
raw3270_request_free(tp->kreset);
|
||||
raw3270_request_free(tp->read);
|
||||
|
|
@ -889,7 +882,8 @@ tty3270_open(struct tty_struct *tty, struct file * filp)
|
|||
INIT_LIST_HEAD(&tp->update);
|
||||
INIT_LIST_HEAD(&tp->rcl_lines);
|
||||
tp->rcl_max = 20;
|
||||
init_timer(&tp->timer);
|
||||
setup_timer(&tp->timer, (void (*)(unsigned long)) tty3270_update,
|
||||
(unsigned long) tp);
|
||||
tasklet_init(&tp->readlet,
|
||||
(void (*)(unsigned long)) tty3270_read_tasklet,
|
||||
(unsigned long) tp->read);
|
||||
|
|
@ -1754,14 +1748,6 @@ static const struct tty_operations tty3270_ops = {
|
|||
.set_termios = tty3270_set_termios
|
||||
};
|
||||
|
||||
static void tty3270_notifier(int index, int active)
|
||||
{
|
||||
if (active)
|
||||
tty_register_device(tty3270_driver, index, NULL);
|
||||
else
|
||||
tty_unregister_device(tty3270_driver, index);
|
||||
}
|
||||
|
||||
/*
|
||||
* 3270 tty registration code called from tty_init().
|
||||
* Most kernel services (incl. kmalloc) are available at this poimt.
|
||||
|
|
@ -1796,12 +1782,6 @@ static int __init tty3270_init(void)
|
|||
return ret;
|
||||
}
|
||||
tty3270_driver = driver;
|
||||
ret = raw3270_register_notifier(tty3270_notifier);
|
||||
if (ret) {
|
||||
put_tty_driver(driver);
|
||||
return ret;
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1810,7 +1790,6 @@ tty3270_exit(void)
|
|||
{
|
||||
struct tty_driver *driver;
|
||||
|
||||
raw3270_unregister_notifier(tty3270_notifier);
|
||||
driver = tty3270_driver;
|
||||
tty3270_driver = NULL;
|
||||
tty_unregister_driver(driver);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#define KMSG_COMPONENT "cio"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
@ -28,7 +29,7 @@
|
|||
#include <asm/chpid.h>
|
||||
#include <asm/airq.h>
|
||||
#include <asm/isc.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/cputime.h>
|
||||
#include <asm/fcx.h>
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/crw.h>
|
||||
|
|
@ -626,8 +627,7 @@ out:
|
|||
* handlers).
|
||||
*
|
||||
*/
|
||||
void
|
||||
do_IRQ (struct pt_regs *regs)
|
||||
void __irq_entry do_IRQ(struct pt_regs *regs)
|
||||
{
|
||||
struct tpi_info *tpi_info;
|
||||
struct subchannel *sch;
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
|
|||
struct subchannel *sch;
|
||||
int ret;
|
||||
|
||||
if (!cdev)
|
||||
if (!cdev || !cdev->dev.parent)
|
||||
return -ENODEV;
|
||||
if (cdev->private->state == DEV_STATE_NOT_OPER)
|
||||
return -ENODEV;
|
||||
|
|
@ -122,8 +122,6 @@ int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
|
|||
cdev->private->state != DEV_STATE_W4SENSE)
|
||||
return -EINVAL;
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (!sch)
|
||||
return -ENODEV;
|
||||
ret = cio_clear(sch);
|
||||
if (ret == 0)
|
||||
cdev->private->intparm = intparm;
|
||||
|
|
@ -161,11 +159,9 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|||
struct subchannel *sch;
|
||||
int ret;
|
||||
|
||||
if (!cdev)
|
||||
if (!cdev || !cdev->dev.parent)
|
||||
return -ENODEV;
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (!sch)
|
||||
return -ENODEV;
|
||||
if (cdev->private->state == DEV_STATE_NOT_OPER)
|
||||
return -ENODEV;
|
||||
if (cdev->private->state == DEV_STATE_VERIFY ||
|
||||
|
|
@ -339,7 +335,7 @@ int ccw_device_halt(struct ccw_device *cdev, unsigned long intparm)
|
|||
struct subchannel *sch;
|
||||
int ret;
|
||||
|
||||
if (!cdev)
|
||||
if (!cdev || !cdev->dev.parent)
|
||||
return -ENODEV;
|
||||
if (cdev->private->state == DEV_STATE_NOT_OPER)
|
||||
return -ENODEV;
|
||||
|
|
@ -347,8 +343,6 @@ int ccw_device_halt(struct ccw_device *cdev, unsigned long intparm)
|
|||
cdev->private->state != DEV_STATE_W4SENSE)
|
||||
return -EINVAL;
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (!sch)
|
||||
return -ENODEV;
|
||||
ret = cio_halt(sch);
|
||||
if (ret == 0)
|
||||
cdev->private->intparm = intparm;
|
||||
|
|
@ -372,11 +366,9 @@ int ccw_device_resume(struct ccw_device *cdev)
|
|||
{
|
||||
struct subchannel *sch;
|
||||
|
||||
if (!cdev)
|
||||
if (!cdev || !cdev->dev.parent)
|
||||
return -ENODEV;
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (!sch)
|
||||
return -ENODEV;
|
||||
if (cdev->private->state == DEV_STATE_NOT_OPER)
|
||||
return -ENODEV;
|
||||
if (cdev->private->state != DEV_STATE_ONLINE ||
|
||||
|
|
@ -471,11 +463,11 @@ __u8 ccw_device_get_path_mask(struct ccw_device *cdev)
|
|||
{
|
||||
struct subchannel *sch;
|
||||
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (!sch)
|
||||
if (!cdev->dev.parent)
|
||||
return 0;
|
||||
else
|
||||
return sch->lpm;
|
||||
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
return sch->lpm;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -881,42 +881,26 @@ no_handler:
|
|||
qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED);
|
||||
}
|
||||
|
||||
static int qdio_establish_check_errors(struct ccw_device *cdev, int cstat,
|
||||
int dstat)
|
||||
{
|
||||
struct qdio_irq *irq_ptr = cdev->private->qdio_data;
|
||||
|
||||
if (cstat || (dstat & ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END))) {
|
||||
DBF_ERROR("EQ:ck con");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!(dstat & DEV_STAT_DEV_END)) {
|
||||
DBF_ERROR("EQ:no dev");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (dstat & ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END)) {
|
||||
DBF_ERROR("EQ: bad io");
|
||||
goto error;
|
||||
}
|
||||
return 0;
|
||||
error:
|
||||
DBF_ERROR("%4x EQ:error", irq_ptr->schid.sch_no);
|
||||
DBF_ERROR("ds: %2x cs:%2x", dstat, cstat);
|
||||
|
||||
qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void qdio_establish_handle_irq(struct ccw_device *cdev, int cstat,
|
||||
int dstat)
|
||||
{
|
||||
struct qdio_irq *irq_ptr = cdev->private->qdio_data;
|
||||
|
||||
DBF_DEV_EVENT(DBF_INFO, irq_ptr, "qest irq");
|
||||
if (!qdio_establish_check_errors(cdev, cstat, dstat))
|
||||
qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ESTABLISHED);
|
||||
|
||||
if (cstat)
|
||||
goto error;
|
||||
if (dstat & ~(DEV_STAT_DEV_END | DEV_STAT_CHN_END))
|
||||
goto error;
|
||||
if (!(dstat & DEV_STAT_DEV_END))
|
||||
goto error;
|
||||
qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ESTABLISHED);
|
||||
return;
|
||||
|
||||
error:
|
||||
DBF_ERROR("%4x EQ:error", irq_ptr->schid.sch_no);
|
||||
DBF_ERROR("ds: %2x cs:%2x", dstat, cstat);
|
||||
qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR);
|
||||
}
|
||||
|
||||
/* qdio interrupt handler */
|
||||
|
|
@ -946,7 +930,6 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
}
|
||||
}
|
||||
qdio_irq_check_sense(irq_ptr, irb);
|
||||
|
||||
cstat = irb->scsw.cmd.cstat;
|
||||
dstat = irb->scsw.cmd.dstat;
|
||||
|
||||
|
|
@ -954,22 +937,19 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,
|
|||
case QDIO_IRQ_STATE_INACTIVE:
|
||||
qdio_establish_handle_irq(cdev, cstat, dstat);
|
||||
break;
|
||||
|
||||
case QDIO_IRQ_STATE_CLEANUP:
|
||||
qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE);
|
||||
break;
|
||||
|
||||
case QDIO_IRQ_STATE_ESTABLISHED:
|
||||
case QDIO_IRQ_STATE_ACTIVE:
|
||||
if (cstat & SCHN_STAT_PCI) {
|
||||
qdio_int_handler_pci(irq_ptr);
|
||||
return;
|
||||
}
|
||||
if ((cstat & ~SCHN_STAT_PCI) || dstat) {
|
||||
if (cstat || dstat)
|
||||
qdio_handle_activate_check(cdev, intparm, cstat,
|
||||
dstat);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
|
@ -1514,7 +1494,7 @@ int do_QDIO(struct ccw_device *cdev, unsigned int callflags,
|
|||
|
||||
if ((bufnr > QDIO_MAX_BUFFERS_PER_Q) ||
|
||||
(count > QDIO_MAX_BUFFERS_PER_Q) ||
|
||||
(q_nr > QDIO_MAX_QUEUES_PER_IRQ))
|
||||
(q_nr >= QDIO_MAX_QUEUES_PER_IRQ))
|
||||
return -EINVAL;
|
||||
|
||||
if (!count)
|
||||
|
|
|
|||
|
|
@ -25,18 +25,6 @@ struct qdio_perf_stats perf_stats;
|
|||
static struct proc_dir_entry *qdio_perf_pde;
|
||||
#endif
|
||||
|
||||
inline void qdio_perf_stat_inc(atomic_long_t *count)
|
||||
{
|
||||
if (qdio_performance_stats)
|
||||
atomic_long_inc(count);
|
||||
}
|
||||
|
||||
inline void qdio_perf_stat_dec(atomic_long_t *count)
|
||||
{
|
||||
if (qdio_performance_stats)
|
||||
atomic_long_dec(count);
|
||||
}
|
||||
|
||||
/*
|
||||
* procfs functions
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
#define QDIO_PERF_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/device.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
struct qdio_perf_stats {
|
||||
|
|
@ -50,10 +49,13 @@ struct qdio_perf_stats {
|
|||
extern struct qdio_perf_stats perf_stats;
|
||||
extern int qdio_performance_stats;
|
||||
|
||||
static inline void qdio_perf_stat_inc(atomic_long_t *count)
|
||||
{
|
||||
if (qdio_performance_stats)
|
||||
atomic_long_inc(count);
|
||||
}
|
||||
|
||||
int qdio_setup_perf_stats(void);
|
||||
void qdio_remove_perf_stats(void);
|
||||
|
||||
extern void qdio_perf_stat_inc(atomic_long_t *count);
|
||||
extern void qdio_perf_stat_dec(atomic_long_t *count);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue