aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/message/i2o/i2o_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/message/i2o/i2o_config.c')
-rw-r--r--drivers/message/i2o/i2o_config.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/message/i2o/i2o_config.c b/drivers/message/i2o/i2o_config.c
index 4fe73d628c5b..286fef3240c4 100644
--- a/drivers/message/i2o/i2o_config.c
+++ b/drivers/message/i2o/i2o_config.c
@@ -36,12 +36,12 @@
36 36
37#include <asm/uaccess.h> 37#include <asm/uaccess.h>
38 38
39#include "core.h"
40
41#define SG_TABLESIZE 30 39#define SG_TABLESIZE 30
42 40
43static int i2o_cfg_ioctl(struct inode *inode, struct file *fp, unsigned int cmd, 41extern int i2o_parm_issue(struct i2o_device *, int, void *, int, void *, int);
44 unsigned long arg); 42
43static int i2o_cfg_ioctl(struct inode *, struct file *, unsigned int,
44 unsigned long);
45 45
46static spinlock_t i2o_config_lock; 46static spinlock_t i2o_config_lock;
47 47
@@ -593,9 +593,6 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,
593 593
594 sg_offset = (msg->u.head[0] >> 4) & 0x0f; 594 sg_offset = (msg->u.head[0] >> 4) & 0x0f;
595 595
596 msg->u.s.icntxt = cpu_to_le32(i2o_config_driver.context);
597 msg->u.s.tcntxt = cpu_to_le32(i2o_cntxt_list_add(c, reply));
598
599 memset(sg_list, 0, sizeof(sg_list[0]) * SG_TABLESIZE); 596 memset(sg_list, 0, sizeof(sg_list[0]) * SG_TABLESIZE);
600 if (sg_offset) { 597 if (sg_offset) {
601 struct sg_simple_element *sg; 598 struct sg_simple_element *sg;
@@ -629,7 +626,7 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,
629 goto cleanup; 626 goto cleanup;
630 } 627 }
631 sg_size = sg[i].flag_count & 0xffffff; 628 sg_size = sg[i].flag_count & 0xffffff;
632 p = &(sg_list[sg_index++]); 629 p = &(sg_list[sg_index]);
633 /* Allocate memory for the transfer */ 630 /* Allocate memory for the transfer */
634 if (i2o_dma_alloc 631 if (i2o_dma_alloc
635 (&c->pdev->dev, p, sg_size, 632 (&c->pdev->dev, p, sg_size,
@@ -640,6 +637,7 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,
640 rcode = -ENOMEM; 637 rcode = -ENOMEM;
641 goto sg_list_cleanup; 638 goto sg_list_cleanup;
642 } 639 }
640 sg_index++;
643 /* Copy in the user's SG buffer if necessary */ 641 /* Copy in the user's SG buffer if necessary */
644 if (sg[i]. 642 if (sg[i].
645 flag_count & 0x04000000 /*I2O_SGL_FLAGS_DIR */ ) { 643 flag_count & 0x04000000 /*I2O_SGL_FLAGS_DIR */ ) {
@@ -661,8 +659,10 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,
661 } 659 }
662 660
663 rcode = i2o_msg_post_wait(c, msg, 60); 661 rcode = i2o_msg_post_wait(c, msg, 60);
664 if (rcode) 662 if (rcode) {
663 reply[4] = ((u32) rcode) << 24;
665 goto sg_list_cleanup; 664 goto sg_list_cleanup;
665 }
666 666
667 if (sg_offset) { 667 if (sg_offset) {
668 u32 msg[I2O_OUTBOUND_MSG_FRAME_SIZE]; 668 u32 msg[I2O_OUTBOUND_MSG_FRAME_SIZE];
@@ -712,6 +712,7 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,
712 } 712 }
713 } 713 }
714 714
715 sg_list_cleanup:
715 /* Copy back the reply to user space */ 716 /* Copy back the reply to user space */
716 if (reply_size) { 717 if (reply_size) {
717 // we wrote our own values for context - now restore the user supplied ones 718 // we wrote our own values for context - now restore the user supplied ones
@@ -729,7 +730,6 @@ static int i2o_cfg_passthru32(struct file *file, unsigned cmnd,
729 } 730 }
730 } 731 }
731 732
732 sg_list_cleanup:
733 for (i = 0; i < sg_index; i++) 733 for (i = 0; i < sg_index; i++)
734 i2o_dma_free(&c->pdev->dev, &sg_list[i]); 734 i2o_dma_free(&c->pdev->dev, &sg_list[i]);
735 735
@@ -827,9 +827,6 @@ static int i2o_cfg_passthru(unsigned long arg)
827 827
828 sg_offset = (msg->u.head[0] >> 4) & 0x0f; 828 sg_offset = (msg->u.head[0] >> 4) & 0x0f;
829 829
830 msg->u.s.icntxt = cpu_to_le32(i2o_config_driver.context);
831 msg->u.s.tcntxt = cpu_to_le32(i2o_cntxt_list_add(c, reply));
832
833 memset(sg_list, 0, sizeof(sg_list[0]) * SG_TABLESIZE); 830 memset(sg_list, 0, sizeof(sg_list[0]) * SG_TABLESIZE);
834 if (sg_offset) { 831 if (sg_offset) {
835 struct sg_simple_element *sg; 832 struct sg_simple_element *sg;
@@ -892,8 +889,10 @@ static int i2o_cfg_passthru(unsigned long arg)
892 } 889 }
893 890
894 rcode = i2o_msg_post_wait(c, msg, 60); 891 rcode = i2o_msg_post_wait(c, msg, 60);
895 if (rcode) 892 if (rcode) {
893 reply[4] = ((u32) rcode) << 24;
896 goto sg_list_cleanup; 894 goto sg_list_cleanup;
895 }
897 896
898 if (sg_offset) { 897 if (sg_offset) {
899 u32 msg[128]; 898 u32 msg[128];
@@ -943,6 +942,7 @@ static int i2o_cfg_passthru(unsigned long arg)
943 } 942 }
944 } 943 }
945 944
945 sg_list_cleanup:
946 /* Copy back the reply to user space */ 946 /* Copy back the reply to user space */
947 if (reply_size) { 947 if (reply_size) {
948 // we wrote our own values for context - now restore the user supplied ones 948 // we wrote our own values for context - now restore the user supplied ones
@@ -959,7 +959,6 @@ static int i2o_cfg_passthru(unsigned long arg)
959 } 959 }
960 } 960 }
961 961
962 sg_list_cleanup:
963 for (i = 0; i < sg_index; i++) 962 for (i = 0; i < sg_index; i++)
964 kfree(sg_list[i]); 963 kfree(sg_list[i]);
965 964