X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fs390%2Fcio%2Fcio.c;fp=drivers%2Fs390%2Fcio%2Fcio.c;h=d0148e5fbb62d2dcd96c24bd51494de4ef319517;hb=16c70f8c1b54b61c3b951b6fb220df250fe09b32;hp=5b20d8c9c0257eec01184b8de15eb4bd2167dd12;hpb=4e76c8a9fa413ccc09d3f7f664183dcce3555d57;p=linux-2.6.git diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 5b20d8c9c..d0148e5fb 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c @@ -11,12 +11,12 @@ */ #include -#include #include #include #include #include #include +#include #include #include @@ -148,7 +148,7 @@ cio_tpi(void) sch->driver->irq(&sch->dev); spin_unlock(&sch->lock); irq_exit (); - __local_bh_enable(); + _local_bh_enable(); return 1; } @@ -520,6 +520,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) memset(sch, 0, sizeof(struct subchannel)); spin_lock_init(&sch->lock); + mutex_init(&sch->reg_mutex); /* Set a name for the subchannel */ snprintf (sch->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", schid.ssid, @@ -639,12 +640,16 @@ do_IRQ (struct pt_regs *regs) spin_lock(&sch->lock); /* Store interrupt response block to lowcore. */ if (tsch (tpi_info->schid, irb) == 0 && sch) { + struct vx_info_save vxis; + /* Keep subchannel information word up to date. */ memcpy (&sch->schib.scsw, &irb->scsw, sizeof (irb->scsw)); /* Call interrupt handler if there is one. */ + __enter_vx_admin(&vxis); if (sch->driver && sch->driver->irq) sch->driver->irq(&sch->dev); + __leave_vx_admin(&vxis); } if (sch) spin_unlock(&sch->lock); @@ -798,7 +803,7 @@ struct subchannel * cio_get_console_subchannel(void) { if (!console_subchannel_in_use) - return 0; + return NULL; return &console_subchannel; } @@ -876,5 +881,6 @@ void reipl(unsigned long devno) { clear_all_subchannels(); + cio_reset_channel_paths(); do_reipl(devno); }