static void mts_do_sg (struct urb* transfer)
 {
-       struct scatterlist * sg;
        int status = transfer->status;
        MTS_INT_INIT();
 
                mts_transfer_cleanup(transfer);
         }
 
-       sg = scsi_sglist(context->srb);
-       context->fragment++;
+       context->curr_sg = sg_next(context->curr_sg);
        mts_int_submit_urb(transfer,
                           context->data_pipe,
-                          sg_virt(&sg[context->fragment]),
-                          sg[context->fragment].length,
-                          context->fragment + 1 == scsi_sg_count(context->srb) ?
+                          sg_virt(context->curr_sg),
+                          context->curr_sg->length,
+                          sg_is_last(context->curr_sg) ?
                           mts_data_done : mts_do_sg);
 }
 
 mts_build_transfer_context(struct scsi_cmnd *srb, struct mts_desc* desc)
 {
        int pipe;
-       struct scatterlist * sg;
-       
+
        MTS_DEBUG_GOT_HERE();
 
        desc->context.instance = desc;
        desc->context.srb = srb;
-       desc->context.fragment = 0;
 
        if (!scsi_bufflen(srb)) {
                desc->context.data = NULL;
                desc->context.data_length = 0;
                return;
        } else {
-               sg = scsi_sglist(srb);
-               desc->context.data = sg_virt(&sg[0]);
-               desc->context.data_length = sg[0].length;
+               desc->context.curr_sg = scsi_sglist(srb);
+               desc->context.data = sg_virt(desc->context.curr_sg);
+               desc->context.data_length = desc->context.curr_sg->length;
        }