- Use separate buffer for identify data fetching. We can't use main buffer

here if device already running, as data need to be formatted before use.
- Remove some saved_ccb variables. They are unused now.
This commit is contained in:
Alexander Motin 2010-02-02 18:03:21 +00:00
parent e9d240ecf3
commit a9b8edb194
3 changed files with 19 additions and 45 deletions

View File

@ -123,7 +123,6 @@ struct ada_softc {
int trim_running; int trim_running;
struct disk_params params; struct disk_params params;
struct disk *disk; struct disk *disk;
union ccb saved_ccb;
struct task sysctl_task; struct task sysctl_task;
struct sysctl_ctx_list sysctl_ctx; struct sysctl_ctx_list sysctl_ctx;
struct sysctl_oid *sysctl_tree; struct sysctl_oid *sysctl_tree;
@ -1098,8 +1097,7 @@ adaerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags)
periph = xpt_path_periph(ccb->ccb_h.path); periph = xpt_path_periph(ccb->ccb_h.path);
softc = (struct ada_softc *)periph->softc; softc = (struct ada_softc *)periph->softc;
return(cam_periph_error(ccb, cam_flags, sense_flags, return(cam_periph_error(ccb, cam_flags, sense_flags, NULL));
&softc->saved_ccb));
} }
static void static void

View File

@ -101,7 +101,6 @@ struct pmp_softc {
int events; int events;
#define PMP_EV_RESET 1 #define PMP_EV_RESET 1
#define PMP_EV_RESCAN 2 #define PMP_EV_RESCAN 2
union ccb saved_ccb;
struct task sysctl_task; struct task sysctl_task;
struct sysctl_ctx_list sysctl_ctx; struct sysctl_ctx_list sysctl_ctx;
struct sysctl_oid *sysctl_tree; struct sysctl_oid *sysctl_tree;
@ -552,8 +551,7 @@ pmpdone(struct cam_periph *periph, union ccb *done_ccb)
priority = done_ccb->ccb_h.pinfo.priority; priority = done_ccb->ccb_h.pinfo.priority;
if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
if (cam_periph_error(done_ccb, 0, 0, if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) {
&softc->saved_ccb) == ERESTART) {
return; return;
} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
cam_release_devq(done_ccb->ccb_h.path, cam_release_devq(done_ccb->ccb_h.path,

View File

@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$");
#include <sys/time.h> #include <sys/time.h>
#include <sys/conf.h> #include <sys/conf.h>
#include <sys/fcntl.h> #include <sys/fcntl.h>
#include <sys/md5.h>
#include <sys/interrupt.h> #include <sys/interrupt.h>
#include <sys/sbuf.h> #include <sys/sbuf.h>
@ -124,10 +123,9 @@ typedef enum {
typedef struct { typedef struct {
TAILQ_HEAD(, ccb_hdr) request_ccbs; TAILQ_HEAD(, ccb_hdr) request_ccbs;
struct ata_params ident_data;
probe_action action; probe_action action;
union ccb saved_ccb;
probe_flags flags; probe_flags flags;
u_int8_t digest[16];
uint32_t pm_pid; uint32_t pm_pid;
uint32_t pm_prv; uint32_t pm_prv;
int restart; int restart;
@ -303,29 +301,13 @@ probestart(struct cam_periph *periph, union ccb *start_ccb)
ata_reset_cmd(ataio); ata_reset_cmd(ataio);
break; break;
case PROBE_IDENTIFY: case PROBE_IDENTIFY:
if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
/* Prepare check that it is the same device. */
MD5_CTX context;
MD5Init(&context);
MD5Update(&context,
(unsigned char *)ident_buf->model,
sizeof(ident_buf->model));
MD5Update(&context,
(unsigned char *)ident_buf->revision,
sizeof(ident_buf->revision));
MD5Update(&context,
(unsigned char *)ident_buf->serial,
sizeof(ident_buf->serial));
MD5Final(softc->digest, &context);
}
cam_fill_ataio(ataio, cam_fill_ataio(ataio,
1, 1,
probedone, probedone,
/*flags*/CAM_DIR_IN, /*flags*/CAM_DIR_IN,
0, 0,
/*data_ptr*/(u_int8_t *)ident_buf, /*data_ptr*/(u_int8_t *)&softc->ident_data,
/*dxfer_len*/sizeof(struct ata_params), /*dxfer_len*/sizeof(softc->ident_data),
30 * 1000); 30 * 1000);
if (periph->path->device->protocol == PROTO_ATA) if (periph->path->device->protocol == PROTO_ATA)
ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0); ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
@ -695,8 +677,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
ident_buf = &path->device->ident_data; ident_buf = &path->device->ident_data;
if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
device_fail: if (cam_periph_error(done_ccb, 0, 0, device_fail: if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) {
&softc->saved_ccb) == ERESTART) {
return; return;
} else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
/* Don't wedge the queue */ /* Don't wedge the queue */
@ -724,6 +705,8 @@ device_fail: if (cam_periph_error(done_ccb, 0, 0,
goto done; goto done;
} }
noerror: noerror:
if (softc->restart)
goto done;
switch (softc->action) { switch (softc->action) {
case PROBE_RESET: case PROBE_RESET:
{ {
@ -766,6 +749,7 @@ device_fail: if (cam_periph_error(done_ccb, 0, 0,
{ {
int16_t *ptr; int16_t *ptr;
ident_buf = &softc->ident_data;
for (ptr = (int16_t *)ident_buf; for (ptr = (int16_t *)ident_buf;
ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) { ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) {
*ptr = le16toh(*ptr); *ptr = le16toh(*ptr);
@ -784,28 +768,22 @@ device_fail: if (cam_periph_error(done_ccb, 0, 0,
ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision)); ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision));
ata_btrim(ident_buf->serial, sizeof(ident_buf->serial)); ata_btrim(ident_buf->serial, sizeof(ident_buf->serial));
ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial)); ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial));
ident_buf = &path->device->ident_data;
if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) { if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
/* Check that it is the same device. */ /* Check that it is the same device. */
MD5_CTX context; if (bcmp(softc->ident_data.model, ident_buf->model,
u_int8_t digest[16]; sizeof(ident_buf->model)) ||
bcmp(softc->ident_data.revision, ident_buf->revision,
MD5Init(&context); sizeof(ident_buf->revision)) ||
MD5Update(&context, bcmp(softc->ident_data.serial, ident_buf->serial,
(unsigned char *)ident_buf->model, sizeof(ident_buf->serial))) {
sizeof(ident_buf->model));
MD5Update(&context,
(unsigned char *)ident_buf->revision,
sizeof(ident_buf->revision));
MD5Update(&context,
(unsigned char *)ident_buf->serial,
sizeof(ident_buf->serial));
MD5Final(digest, &context);
if (bcmp(digest, softc->digest, sizeof(digest))) {
/* Device changed. */ /* Device changed. */
xpt_async(AC_LOST_DEVICE, path, NULL); xpt_async(AC_LOST_DEVICE, path, NULL);
} } else
bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
} else { } else {
bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
/* Clean up from previous instance of this device */ /* Clean up from previous instance of this device */
if (path->device->serial_num != NULL) { if (path->device->serial_num != NULL) {
free(path->device->serial_num, M_CAMXPT); free(path->device->serial_num, M_CAMXPT);