Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 31110
b: refs/heads/master
c: 40154b8
h: refs/heads/master
v: v3
  • Loading branch information
Peter Oberparleiter authored and Martin Schwidefsky committed Jun 29, 2006
1 parent 2c0a828 commit bf3f9bf
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 37 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 887ab5992925736ab23985c35f8149739e9de354
refs/heads/master: 40154b824331cd9c81c06545761338f3d80a36e2
35 changes: 1 addition & 34 deletions trunk/drivers/s390/cio/blacklist.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,39 +224,6 @@ is_blacklisted (int ssid, int devno)
}

#ifdef CONFIG_PROC_FS
static int
__s390_redo_validation(struct subchannel_id schid, void *data)
{
int ret;
struct subchannel *sch;

sch = get_subchannel_by_schid(schid);
if (sch) {
/* Already known. */
put_device(&sch->dev);
return 0;
}
ret = css_probe_device(schid);
if (ret == -ENXIO)
return ret; /* We're through. */
if (ret == -ENOMEM)
/* Stop validation for now. Bad, but no need for a panic. */
return ret;
return 0;
}

/*
* Function: s390_redo_validation
* Look for no longer blacklisted devices
* FIXME: there must be a better way to do this */
static inline void
s390_redo_validation (void)
{
CIO_TRACE_EVENT (0, "redoval");

for_each_subchannel(__s390_redo_validation, NULL);
}

/*
* Function: blacklist_parse_proc_parameters
* parse the stuff which is piped to /proc/cio_ignore
Expand All @@ -281,7 +248,7 @@ blacklist_parse_proc_parameters (char *buf)
return;
}

s390_redo_validation ();
css_schedule_reprobe();
}

/* Iterator struct for all devices. */
Expand Down
63 changes: 63 additions & 0 deletions trunk/drivers/s390/cio/css.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
#include "cio_debug.h"
#include "ioasm.h"
#include "chsc.h"
#include "device.h"

int need_rescan = 0;
int css_init_done = 0;
static int need_reprobe = 0;
static int max_ssid = 0;

struct channel_subsystem *css[__MAX_CSSID + 1];
Expand Down Expand Up @@ -339,6 +341,67 @@ typedef void (*workfunc)(void *);
DECLARE_WORK(slow_path_work, (workfunc)css_trigger_slow_path, NULL);
struct workqueue_struct *slow_path_wq;

/* Reprobe subchannel if unregistered. */
static int reprobe_subchannel(struct subchannel_id schid, void *data)
{
struct subchannel *sch;
int ret;

CIO_DEBUG(KERN_INFO, 6, "cio: reprobe 0.%x.%04x\n",
schid.ssid, schid.sch_no);
if (need_reprobe)
return -EAGAIN;

sch = get_subchannel_by_schid(schid);
if (sch) {
/* Already known. */
put_device(&sch->dev);
return 0;
}

ret = css_probe_device(schid);
switch (ret) {
case 0:
break;
case -ENXIO:
case -ENOMEM:
/* These should abort looping */
break;
default:
ret = 0;
}

return ret;
}

/* Work function used to reprobe all unregistered subchannels. */
static void reprobe_all(void *data)
{
int ret;

CIO_MSG_EVENT(2, "reprobe start\n");

need_reprobe = 0;
/* Make sure initial subchannel scan is done. */
wait_event(ccw_device_init_wq,
atomic_read(&ccw_device_init_count) == 0);
ret = for_each_subchannel(reprobe_subchannel, NULL);

CIO_MSG_EVENT(2, "reprobe done (rc=%d, need_reprobe=%d)\n", ret,
need_reprobe);
}

DECLARE_WORK(css_reprobe_work, reprobe_all, NULL);

/* Schedule reprobing of all unregistered subchannels. */
void css_schedule_reprobe(void)
{
need_reprobe = 1;
queue_work(ccw_device_work, &css_reprobe_work);
}

EXPORT_SYMBOL_GPL(css_schedule_reprobe);

/*
* Rescan for new devices. FIXME: This is slow.
* This function is called when we have lost CRWs due to overflows and we have
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/s390/cio/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ struct css_driver io_subchannel_driver = {

struct workqueue_struct *ccw_device_work;
struct workqueue_struct *ccw_device_notify_work;
static wait_queue_head_t ccw_device_init_wq;
static atomic_t ccw_device_init_count;
wait_queue_head_t ccw_device_init_wq;
atomic_t ccw_device_init_count;

static int __init
init_ccw_bus_type (void)
Expand Down
6 changes: 6 additions & 0 deletions trunk/drivers/s390/cio/device.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#ifndef S390_DEVICE_H
#define S390_DEVICE_H

#include <asm/ccwdev.h>
#include <asm/atomic.h>
#include <linux/wait.h>

/*
* states of the device statemachine
*/
Expand Down Expand Up @@ -67,6 +71,8 @@ dev_fsm_final_state(struct ccw_device *cdev)

extern struct workqueue_struct *ccw_device_work;
extern struct workqueue_struct *ccw_device_notify_work;
extern wait_queue_head_t ccw_device_init_wq;
extern atomic_t ccw_device_init_count;

void io_subchannel_recog_done(struct ccw_device *cdev);

Expand Down
2 changes: 2 additions & 0 deletions trunk/include/asm-s390/cio.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,8 @@ extern void wait_cons_dev(void);

extern void clear_all_subchannels(void);

extern void css_schedule_reprobe(void);

#endif

#endif

0 comments on commit bf3f9bf

Please sign in to comment.