- 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:
parent
e9d240ecf3
commit
a9b8edb194
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user